Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] zapytanie - zliczanie ilosci przypisanych
Forum PHP.pl > Forum > Bazy danych
AxZx
witam

mam tabele
tag: idtag, nazwa
strona: idstrona, nazwa
tag_strona: idtag, idstrona

w bazie zapisane sa powiazania tagow ze stronami. chcialbym teraz pobrac ilosc stron ktore sa powiazane z tagami o wybranych id (np. 3,4,5,6).
problem jest taki ze do jednego tagu moze byc przypisanych N stron i tak samo do jednej strony moze byc przypisanych M tagow.
jak zliczam tak po prostu to wynik jest wiekszy niz rzeczywista liczba stron.
pobierajac te powiazane strony (nie zliczajac) po prostu dodaje klauzule group by idstrona. w zliczaniu nie da sie tego zrobic.

ktos ma pomysl jak to rozwiazac?
nevt
  1. SELECT idtag, COUNT(idstrona) AS ile_stron FROM tag_strona GROUP BY idtag HAVING idtag IN(3, 4, 5, 6);

powodzenia
AxZx
nie dziala.

zapomnialem napisac ze najlepsza sytuacja byla by gdyby bylo from strona a nie strona_tag.

np cos takiego
  1. SELECT count(*) AS ile FROM strona AS s INNER JOIN strona_tag AS st ON (st.idstrona = s.idstrona AND st.idtag IN(2,3,4,5,6))


jednak takie zapytanie nie zwraca pojedynczej wartosci.
nevt
działa, sprawdzałem na bazie testowej. skoro tobie nie działa, to coś w twojej bazie musi być inaczej, niż opisałeś... robienie tego na 2 tabelach z JOIN jest kompletnie zbędne i nieoptymalne.
AxZx
widocznie cos jest nie tak, bo u mnie nie dziala.
wklejam strukture bazy wraz z przykladami danych - zeby byla jasnosc:)
powiedzmy ze chcesz pobrac ilosc stron ktore sa powiazane z tagami 1,8,9.
wg mnie powinno byc 4 smile.gif

  1. CREATE TABLE IF NOT EXISTS `strona` (
  2. `idstrona` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `nazwa` varchar(45) collate latin1_general_ci NOT NULL,
  4. PRIMARY KEY (`idstrona`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=6 ;
  6.  
  7. INSERT INTO `strona` (`idstrona`, `nazwa`) VALUES
  8. (1, 'kontakt'),
  9. (2, 'porady'),
  10. (3, 'informacje'),
  11. (4, 'wiadomosci'),
  12. (5, 'ogloszenia');
  13.  
  14. CREATE TABLE IF NOT EXISTS `strona_tag` (
  15. `idstrona` int(10) UNSIGNED NOT NULL,
  16. `idtag` int(10) UNSIGNED NOT NULL,
  17. PRIMARY KEY (`idstrona`,`idtag`)
  18. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
  19.  
  20. INSERT INTO `strona_tag` (`idstrona`, `idtag`) VALUES
  21. (1, 1),
  22. (1, 8),
  23. (1, 9),
  24. (2, 1),
  25. (2, 2),
  26. (3, 1),
  27. (4, 2),
  28. (4, 3),
  29. (4, 4),
  30. (4, 5),
  31. (5, 8),
  32. (5, 9);
  33.  
  34. CREATE TABLE IF NOT EXISTS `tag` (
  35. `idtag` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  36. `nazwa` varchar(45) character SET latin1 collate latin1_general_ci NOT NULL,
  37. PRIMARY KEY (`idtag`)
  38. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
  39.  
  40. INSERT INTO `tag` (`idtag`, `nazwa`) VALUES
  41. (1, 'kot'),
  42. (2, 'pies'),
  43. (3, 'mysz'),
  44. (4, 'szczupak'),
  45. (5, 'czapla'),
  46. (8, 'kuropatwa'),
  47. (9, 'kogut');
Kicok
DISTINCT
  1. SELECT COUNT( DISTINCT idstrona )
  2. FROM strona_tag WHERE idtag IN (1,8,9)
AxZx
wiedzialem ze z tym distinct cos bedzie smile.gif
probowalem distinct(count(*))

dzieki bardzo
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.