Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zapytania
kilas88
post
Post #1





Grupa: Zarejestrowani
Postów: 305
Pomógł: 25
Dołączył: 27.01.2007

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


Witam.

Mam w bazie takie oto tabele z autorami i wierszami :

love_authors
Kod
ID, NAME_FIRST, NAME_LAST, NAME_PREFIX, NAME_URL, MAIL, DESCRIPTION, IMAGE, STATUS


love_lyrics
Kod
ID, AUTHOR_ID, TITLE


Chcę na stronie teraz wyświetlić autorów wraz z liczbą wierszy (liryka zliczana z tabeli love_lyrics). Relacja zachodzi pomiędzy ID i AUTHOR_ID. Dotychczas robiłem to w następujący sposób:

  1. SELECT
  2.   ID,
  3.   CONCAT(NAME_LAST, ' ', NAME_FIRST) AS AUTHOR_NAME, 
  4.   NAME_PREFIX,
  5.   NAME_URL,
  6.   DESCRIPTION,
  7.   IMAGE
  8.  
  9. FROM   love_authors
  10.   
  11. WHERE   STATUS = 1
  12.   
  13. ORDER BY   AUTHOR_NAME, NAME_PREFIX
  14.  
  15. LIMIT 0, 5


Oraz w pętli while dla każdego rekordu pobieram osobno liczbę wierszy:
  1. SELECT count(ID) FROM love_lyrics WHERE STATUS = 1 AND AUTHOR_ID=".$get_author['ID']."


Dla każdej podstrony wykonywanych jest więc kilka połączeń (6). Czy mógłbym jakoś połączyć te tabele w celu optymalizacji zapytania?

Z góry dziękuję za wszelkie podpowiedzi.

Ten post edytował kilas88 9.03.2009, 18:11:44
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Można i byłoby to raczej najszybsze rozwiazanie.
Lecz można to tez policzyc w jednym zapytaniu
  1. SELECT
  2. a.ID,
  3. CONCAT(a.NAME_LAST, ' ', a.NAME_FIRST) AS AUTHOR_NAME,
  4. a.NAME_PREFIX,
  5. a.NAME_URL,
  6. a.DESCRIPTION,
  7. a.IMAGE,
  8. (SELECT count(ID) FROM love_lyrics WHERE STATUS = 1 AND AUTHOR_ID=a.ID) AS ile
  9.  
  10. FROM love_authors a
  11.  
  12. WHERE a.STATUS = 1
  13.  
  14. ORDER BY a.AUTHOR_NAME, a.NAME_PREFIX
  15.  
  16. LIMIT 0, 5


Ten post edytował wookieb 9.03.2009, 18:21:05
Go to the top of the page
+Quote Post
griken
post
Post #3





Grupa: Zarejestrowani
Postów: 19
Pomógł: 1
Dołączył: 27.08.2007
Skąd: Londyn

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


Cytat(wookieb @ 9.03.2009, 19:20:44 ) *
Można i byłoby to raczej najszybsze rozwiazanie.
Lecz można to tez policzyc w jednym zapytaniu
  1. SELECT
  2. a.ID,
  3. CONCAT(a.NAME_LAST, ' ', a.NAME_FIRST) AS AUTHOR_NAME,
  4. a.NAME_PREFIX,
  5. a.NAME_URL,
  6. a.DESCRIPTION,
  7. a.IMAGE,
  8. (SELECT count(ID) FROM love_lyrics WHERE STATUS = 1 AND AUTHOR_ID=a.ID) AS ile
  9.  
  10. FROM love_authors a
  11.  
  12. WHERE a.STATUS = 1
  13.  
  14. ORDER BY a.AUTHOR_NAME, a.NAME_PREFIX
  15.  
  16. LIMIT 0, 5


wookieb mam male pytanko (moze sie orientujesz), a nie lepiej wyrzucic 'STATUS = 1' z podzapytania jesli podany warunek jest juz sprecyzowany w glownym WHERE? tj.

  1. SELECT a.ID,CONCAT(a.NAME_LAST, ' ', a.NAME_FIRST) AS AUTHOR_NAME,
  2. (SELECT count(ID) FROM love_lyrics WHERE AUTHOR_ID=a.ID) AS ile
  3. FROM love_authors AS a
  4. WHERE a.STATUS = 1
  5. ORDER BY AUTHOR_NAME
  6. LIMIT 0, 5


albo nawet

  1. SELECT a.ID,CONCAT(a.NAME_LAST, ' ', a.NAME_FIRST) AS AUTHOR_NAME,
  2. count(love_lyrics.`id`) AS ile
  3. FROM love_authors AS a
  4. LEFT JOIN love_lyrics ON a.`id`=love_lyrics.`AUTHOR_ID`
  5. WHERE a.STATUS = 1
  6. GROUP BY a.id
  7. ORDER BY AUTHOR_NAME
  8. LIMIT 0, 5


jak myslisz, ktore bedzie wydajniesze w tym wypadku? sprawdz explaina dla obydwoch, dla drugiego zapytania pokazuje zawsze 'select_type' -> 'SIMPLE' ale jednoczesnie 'Using where; Using temporary; Using filesort' co nie jest mile widzane, prawda?
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 11.10.2025 - 15:38