Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wybieranie rekordów z ich posortowaniem
Mion
post
Post #1





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

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


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.

Ten post edytował Mion 22.11.2010, 14:43:08
Go to the top of the page
+Quote Post
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Mion
post
Post #3





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

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


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.

Ten post edytował Mion 22.11.2010, 15:13:45
Go to the top of the page
+Quote Post
Majzok
post
Post #4





Grupa: Zarejestrowani
Postów: 20
Pomógł: 1
Dołączył: 25.11.2007
Skąd: Kraków

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


Polecam inner joiny winksmiley.jpg
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Mion
post
Post #6





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

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


@ 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

Ten post edytował Mion 24.11.2010, 15:34:40
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Mion
post
Post #8





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

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


smile.gif robiłem Explain i tam gdzie pokazuje-proponuje indeksy mam...
OK, dziękuję za pomoc.
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 Aktualny czas: 20.08.2025 - 17:28