Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zoptymalizowane zapytanie ( pobieranie kilku rekordów z kilku tabel na raz)
Forum PHP.pl > Forum > Bazy danych
quality
Witam
Calkiem niedawno pisalem posta jak poprawnie pobrac kilka danych z kilku tabel jednym jak najbardziej zoptymalizowanym zapytaniem.

Dzisiaj mam kolejny problem tej natury.

Mianowicie mam liste artykulow ( stronnicowana), lista to wyswietlenie samych tytulow + dokladnie 2 komentarze do tego artykulu.

Jak wiadomo komentarzy moze byc znacznie wiecej, ale mi jest potrzeba pobrac dokladnie po 2 do kazdego tematu.

Sposoby z mojego poprzedniego postu troche odpadaja, poniewaz LEFT JOIN nie pobiore dokladnie 2 komentarzy ( no chyba ze ktos zna sposob biggrin.gif ). Z dwoma osobnymi zapytaniami tez nie wiem jak zrobic limit komentarzy przy IN ( 1, 2, 3 ... ) .

Tutaj szczerze to jedyne co mi sie nasuwa to dla kazdego artykulu osobne zapytanie i pobranie osobno dwoch komentarzy w petli, jednak wiem ze to nie jest najlepszy sposob.

Czy ktos ma jakas sztuczke, albo lepsze rozwiazanie tego ? Szczerze mowiac nie wiem nawet jaki przyklad podac zeby to pobrac sensownie. Moze ktos nakieruje ?

Pozdrawiam Adrian
Wicepsik
Pokaż strukturę tabel z artykułami i komentarzami
Riklaunim
Lista artykułów i jeszcze komentarze do tego? Nie za dużo szczęścia na jednej stronie? Jednym zapytaniem tego nie załatwisz, na pewno nie jakimś nadmiernie skomplikowanym winksmiley.jpg Najprościej to pobrać listę artykułów i zrobić listę ID tych artykułów. Następnie pobrać po dwa komentarze stosując UNION ALL dla każdego zapytania dla konkretnego ID artykułu. Coś w stylu takim:
  1. SELECT * FROM comments WHERE art_id = $pierwsze_id LIMIT 2
  2. UNION ALL
  3. SELECT * FROM comments WHERE art_id = $drugie_id LIMIT 2


Idąc dalej gdy jest taka potrzeba można by w tabeli artykułów zapisywać ID dwóch ostatnich komentarzy dla każdego artykułu, czy też nawet duplikować ich treść.
quality
Wicepsik struktura nie jest istotna, jest to najprostsza konstrukcja dwoch tabel komentarze + id_artykulu, artykuly smile.gif Tak jak podal Riklaunim. Wiem wiem ze duzo, ale tak musi byc winksmiley.jpg

Co do metody z UNION, to na jedno wyjdzie pobieranie w petli osobnymi zapytaniami tych komentarzy.

Pomysl z zapisywaniem ostatnich dwoch id, dla kazdego artykulu od strony optymalizacji bardzo doby, jednak z wdrozeniem troche ciezko. Trzeba by bylo przy dodawaniu kazdego komentarza aktualizowac artykul. Hmmm ale do przemyslenia.

Zaznaczam ze glownie zalezy mi na optymalnym rozwiazaniu.

Jakies inne sposoby ?

Witam
Rozwiazalem problem

Dla poszukujacych takiego rozwiazania podaje prosty sql

  1. SELECT a.id, a.title, b.* FROM content AS a
  2. LEFT JOIN (SELECT * FROM comments LIMIT 2) AS b ON b.id_content=a.id


Zapytanie pobiera cala liste artykulow (content) plus po dokladnie 2 komentarze do nich smile.gif

Sadze ze to jest najwydajniejsze rozwiazanie
Sajrox
Hmm na pewno pobiera poprawnie ? Wydaje mi się że w zapytaniu jest błąd, bo dla każdego artukułu będzie brało pod uwagę zawsze 2 te same komentarze:

Może tak:
  1. SELECT a.id, a.title, b.* FROM content AS a
  2. LEFT JOIN (SELECT * FROM comments WHERE a.id=id_content ORDER BY id DESC LIMIT 2) AS b ON b.id_content=a.id
Riklaunim
Podzapytania to najgorsze rozwiązanie bo MySQL nie używa do nich indeksów. Rozwiązanie z UNION ALL ma to do siebie że przesyłasz jedno zapytanie a nie wiele w pętli, a jako że nie jest to skomplikowane zapytanie - nie ma czego tutaj optymalizować. Jak dojdziesz do poziomu ruchu generowanego przez portal społecznościowy to optymalizować będzie można, ale nie w pionie próbując przekombinować zapytania winksmiley.jpg
quality
Hmmm no wlasnie sie zorientowalem ze jednak nie pobiera mi poprawnie biggrin.gif

Kurcze i nadal nie wiem jak to rozwiazac biggrin.gif

Moze podsuniecie jakis lepszy pomysl ?

Riklaunim - co miales na mysli piszaqc UNION ALL ?
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.