Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [sql] zapytanie - zliczanie ilosci przypisanych
AxZx
post 10.09.2008, 21:54:04
Post #1





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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?


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
nevt
post 10.09.2008, 22:17:11
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


  1. SELECT idtag, COUNT(idstrona) AS ile_stron FROM tag_strona GROUP BY idtag HAVING idtag IN(3, 4, 5, 6);

powodzenia


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
AxZx
post 10.09.2008, 22:38:43
Post #3





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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.

Ten post edytował AxZx 10.09.2008, 22:38:57


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
nevt
post 11.09.2008, 07:17:50
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
AxZx
post 11.09.2008, 09:54:58
Post #5





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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');


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Kicok
post 11.09.2008, 13:01:53
Post #6





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


DISTINCT
  1. SELECT COUNT( DISTINCT idstrona )
  2. FROM strona_tag WHERE idtag IN (1,8,9)


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
AxZx
post 11.09.2008, 13:36:57
Post #7





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


wiedzialem ze z tym distinct cos bedzie smile.gif
probowalem distinct(count(*))

dzieki bardzo


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.06.2025 - 04:14