Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MYSQL] Zliczanie rekordów jednym zapytaniem
Skie
post 4.07.2009, 23:23:43
Post #1





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

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


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. :-)


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
0rion
post 4.07.2009, 23:36:47
Post #2





Grupa: Zarejestrowani
Postów: 3
Pomógł: 1
Dołączył: 21.02.2008

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


Left join, count i group by winksmiley.jpg
Go to the top of the page
+Quote Post
Skie
post 4.07.2009, 23:42:22
Post #3





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

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


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.


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
0rion
post 4.07.2009, 23:48:55
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 1
Dołączył: 21.02.2008

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


Z tego co wiem powinien pobierać, jak nie działa, to pokaż jak to wrzuciłeś.
Go to the top of the page
+Quote Post
Skie
post 5.07.2009, 00:12:14
Post #5





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

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


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"


Ten post edytował Skie 5.07.2009, 01:02:21


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
0rion
post 5.07.2009, 01:10:44
Post #6





Grupa: Zarejestrowani
Postów: 3
Pomógł: 1
Dołączył: 21.02.2008

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


  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.
Go to the top of the page
+Quote Post
Skie
post 5.07.2009, 11:10:00
Post #7





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

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


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 ^^


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
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: 5.07.2025 - 14:03