Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wybieranie rekordów z ich posortowaniem
Forum PHP.pl > Forum > Bazy danych
Mion
Jest tabela:
  1. SELECT Z.`id_komentarza`, Z.`id_zdjecia`, Z.`tresc_komentarza`, Z.`data` FROM ZdjeciaKomentarze Z;
Przechowująca komentarze zdjęć usera [ich jest dosyć dużo 259809]

Oraz druga przechowująca zdjecia usera
  1. SELECT U.`idz`, U.`id_usera`, U.`plik_zdjecia` FROM UserZdjecia U;


Problem jest taki by ułożyć zapytanie wybierające ostatnie 20 komentarzy jakie zostawili userzy do jego wszystkich zdjęć (nie jednego zdjęcia) danego usera np o U.`id_usera` = 422

Mam dzisiaj jakieś zaćmienie dlatego zwracam się o pomoc w tym zapytaniu.
thek
Połącz tabele po id_zdjęcia, w warunku określ o jakiego usera chodzi, posortuj po dacie (choć moim zdaniem można też po id komentarza) malejąco, wybierz pierwszych X smile.gif
Mion
Takie złączenie nie daje oczekiwanych efektów, bo komentarze w wynikach nie pojawiają się ostatnie
  1. SELECT U.`idz`, U.`id_usera`, U.`nick`, U.`zdjecie_nazwa` , Z.`data`,Z.`tresc_komentarza`
  2. FROM UserZdjecia U
  3. LEFT OUTER JOIN ZdjeciaKomentarze Z ON Z.id_zdjecia=U.idz
  4. WHERE U.`id_usera` = 422 AND Z.`tresc_komentarza` IS NOT NULL
  5. GROUP BY U.`idz`
  6. ORDER BY Z.`id_komentarza` DESC;
Problem jest bardziej złożony niż na pierwszy rzut oka się wydaje zwłaszcza, że chodzi o to by wybrać po jednym ostatnim komentarzu.
Majzok
Polecam inner joiny winksmiley.jpg
thek
To trzeba było tak pisać od razu, że mają się pojawić ostatnie wpisy dla X zdjęć. To co opisałeś jako problem mój opis rozwiązuje prawidłowo. Problemem jest to, czego nie napisałeś na starcie, a mianowicie, że ma być po jednym, ostatnim komentarzu dla X zdjęć. Krecią robotę robi Ci grupowanie. Niestety bierze ono zawsze pierwszy napotkany wynik, a Ty chcesz ostatni. Musisz więc wszystko odwrócić zanim dojdzie do grupowania. Można to zrobić na kilka sposobów, ale niestety nie obejdzie się bez podzapytania. Najprostsze rozwiązanie to tabelę komentarzy "odwrócić", a więc do zapytania JOIN posłać ją z ORDER BY id zdjęcia ustawionym na DESC. Wtedy pierwszymi napotkanymi id po grupowaniu będą te najwyższe. Nie jest to rozwiązanie idealne, ale myślę, że wystarczy Ci.
Mion
@ więc do zapytania JOIN posłać ją z ORDER BY id zdjęcia ustawionym na DESC.
Ale o ile dobrze się rozumiemy, albo i nie to co Piszesz tyczy sortowania ustawienia zdjęć, a ja potrzebuje komentarzy.

Jeszcze raz opisze o co chodzi. Userzy mają swoje zdjęcia tworząc w ten sposób galerię usera które są komentowane przez innych userów i kwestia jest taka by powiedzmy w panelu konta była zakładka z ostatnimi komentarzami [po jednym ostatnim dla danego zdjęcia] globalnie ustawione malejąco przykładowe rekordy:
[Z.tresc_komentarza] [ Z.data]
Jakiś komentarz do zdjęcia 21 | 2010-10-22 12:26
Jakiś komentarz do zdjęcia 3 | 2010-10-22 11:26
Jakiś komentarz do zdjęcia 6 | 2010-10-21 10:26
Jakiś komentarz do zdjęcia 1 | 2010-10-20 18:36

-------
Poradziłem sobie z tym problemem takim zapytaniem:
  1. SELECT U.`idz`,U.`id_usera`, U.`zdjecie_nazwa`, U.`idz`, KT.`id_zdjecia`, KT.`tresc_komentarza`, KT.`id_komentarza`, KT.`data`
  2. FROM UserZdjecia U
  3. LEFT JOIN
  4. (
  5. SELECT Z.`id_komentarza`, Z.`id_zdjecia`, Z.`tresc_komentarza`,Z.`data`
  6. FROM ZdjeciaKomentarze Z
  7. ORDER BY Z.`id_komentarza` DESC
  8. ) KT ON (KT.id_zdjecia = U.`idz`)
  9. WHERE U.`id_usera` = 422
  10. GROUP BY U.`idz`
  11. ORDER BY KT.id_komentarza DESC
  12. LIMIT 50;
Jego wykonanie nie zalicza się do demonów prędkości, bo wykonuje się 2 - 3 sekundy, ale wyniki cachuje w memcache wiec może być smile.gif
thek
Czyli zrobiłeś to, co napisałem smile.gif Odwróciłeś tabelę komentarzy, połączyłeś, ograniczając do konkretnego usera i pogrupowałeś. Teraz najlepiej zrób sobie explain i zobacz czy gdzieś nie możesz postawić indeksów. Powinny one być na kolumnach używanych do łączenia, order by i group by.
Mion
smile.gif robiłem Explain i tam gdzie pokazuje-proponuje indeksy mam...
OK, dziękuję za pomoc.
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.