Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] Zliczanie rekordów jednym zapytaniem
Forum PHP.pl > Forum > Przedszkole
Skie
Witam,
temat widzę, że już dosyć oklepany, lecz używając opcji szukaj na forum nie znalazłem żadnej konkretnej odpowiedzi.

Mam w swojej bazie 2 tabele:

guilds_forums_headtitles:
Kod
id | guild_id | name | descp


guilds_forums_topics:
Kod
id | headtitle_id | owner | name | send_time | send_date


Pobieram rekordy z guilds_forums_headtitles w następujący sposób:
  1. "SELECT guilds_forums_headtitles.*
  2. FROM guilds_forums_headtitles WHERE guilds_forums_headtitles.id=".$id." AND guilds_forums_headtitles.guild_id=".$guild_id."
  3. ORDER BY id ASC"


I teraz chciałbym, żeby rozbudować to zapytanie tak, by dla każdego rekordu, zliczało ilość "topiców" w guilds_forums_topics, gdzie guilds_forums_topics.headtitle_id=guilds_forums_headtitles.id

Próbowałem coś takiego zrobić za pomocą COUNT() lecz nie jestem asem w pisaniu zapytań do baz MySQL i średnio mi wyszło.

Prosiłbym o pomoc, porady, jakieś linki do stron gdzie jest opisane jak takie coś zrobić etc. :-)
0rion
Left join, count i group by winksmiley.jpg
Skie
Cytat(0rion @ 5.07.2009, 00:36:47 ) *
Left join, count i group by winksmiley.jpg


Tak, ale wtedy gdy nie będzie żadnych topic'ów w danym headtitle to ten headtitle w ogóle nie zostanie pobrany.
0rion
Z tego co wiem powinien pobierać, jak nie działa, to pokaż jak to wrzuciłeś.
Skie
Jak dobrze pamiętam tak to było:

  1. "SELECT guilds_forums_headtitles.*, COUNT(guilds_forums_topics.*) AS cnt
  2. FROM guilds_forums_headtitles, guilds_forums_topics
  3. WHERE guilds_forums_topics.headtitle_id=guilds_forums_headtitles.id AND guilds_forums_headtitles.id=".$id." AND guilds_forums_headtitles.guild_id=".$guild_id."
  4. GROUP BY guilds_forums_headtitles.id
  5. ORDER BY guilds_forums_headtitles.id ASC"



EDIT:
Udało mi się to zrobić wreszcie ;-)
Teraz prosiłbym o opinię czy takie zapytanie jest w miarę wydajne:

  1. "SELECT guilds_forums_headtitles.*, (SELECT COUNT(*) FROM guilds_forums_topics WHERE guilds_forums_topics.headtitle_id=guilds_forums_headtitles.id) AS cnt
  2. FROM guilds_forums_headtitles WHERE guilds_forums_headtitles.guild_id=".$guild_id."
  3. ORDER BY guilds_forums_headtitles.id ASC"
0rion
  1. "SELECT guilds_forums_headtitles.*, COUNT(guilds_forums_topics.*) AS cnt
  2. FROM (guilds_forums_headtitles LEFT JOIN guilds_forums_topics ON guilds_forums_topics.headtitle_id=guilds_forums_headtitles.id )
  3. WHERE guilds_forums_headtitles.id=".$id." AND guilds_forums_headtitles.guild_id=".$guild_id."
  4. GROUP BY guilds_forums_headtitles.id
  5. ORDER BY guilds_forums_headtitles.id ASC"


W tym pierwszym zabrakło LEFT JOINA. winksmiley.jpg Z tego co wiem LEFT JOIN będzie bardziej wydajny od tego co wrzuciłeś niżej.
Skie
Z tego co ja czytałem to mój zapis to po prostu alternatywa dla JOIN'a, wolę taki zapis bo jest dla mnie bardziej zrozumiały ^^
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.