Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Pobieranie tylko ostatniego wystąpienia z danym dodatkowym ID
Forum PHP.pl > Forum > Przedszkole
smietek
Witam,

w jednym zapytaniu potrzebuję pobrać kilka ostatnich wiadomości z bazy danych.
Struktura jest dość normalna, czyli: ID, ID_Odbiorcy, ID_Wysylajacego, Data, Typ, Tresc, ID_Konwersacji.

Problem w tym, że wiadomości mogą mieć zarówno nadany ID_Konwersacji jak i nie. W przypadku gdy jest nadany ten indeks (który może się powtarzać), chcę pobrać tylko OSTATNIĄ wiadomość (czyli z najwyższym ID) z takim ID_Konwersacji, a resztę wiadomości (bez ID_Konwersacji) pobieram normalnie.

Czy coś takiego jest do zrobienia bez dużej utraty wydajności zapytania?
wNogachSpisz
Cytat(smietek @ 21.06.2012, 12:28:26 ) *
Czy coś takiego jest do zrobienia bez dużej utraty wydajności zapytania?

To pytanie do zespołu od optymalizatora zapytań.
smietek
Cytat(wNogachSpisz @ 21.06.2012, 12:56:03 ) *
To pytanie do zespołu od optymalizatora zapytań.


Czyli do którego działu (ostatnio nie jestem tu częstym bywalcem)?
Ruch Radzionków
po 1 pobierasz z bazy 5 ostatnich id a nastepnie w tym sprawdzasz czy takie cos istnieje
  1. $pobierz = mysql_query("SELECT * FROM cos ORDER BY id DESC");
  2. while($pob = mysql_fetch_array($pobierz))
  3. {
  4. $spr = mysql_query("SELECT * FROM cos WHERE ID_Konwersacji='$pob[ID_Konwersacji]'");
  5. $spr = mysql_num_rows($spr);
  6. no i tu sprawdzasz jezeli jest np. 2 no to znowu pobierasz z bazy tylko ostatnie id
  7. }

o to ci chodzi questionmark.gif
Rysh
Jeżeli dobrze rozumuję, to powinieneś osiągnąć to za pomocą ORDER BY i GROUP.

Edit: na pewno nie idź, w kierunku w tym co pokazuje Ruch Radzionków.
smietek
Cytat(Ruch Radzionków @ 21.06.2012, 23:23:41 ) *
po 1 pobierasz z bazy 5 ostatnich id a nastepnie w tym sprawdzasz czy takie cos istnieje
  1. $pobierz = mysql_query("SELECT * FROM cos ORDER BY id DESC");
  2. while($pob = mysql_fetch_array($pobierz))
  3. {
  4. $spr = mysql_query("SELECT * FROM cos WHERE ID_Konwersacji='$pob[ID_Konwersacji]'");
  5. $spr = mysql_num_rows($spr);
  6. no i tu sprawdzasz jezeli jest np. 2 no to znowu pobierasz z bazy tylko ostatnie id
  7. }

o to ci chodzi questionmark.gif


Zapytania w pętli? Nie dziękuje, to się źle skończy smile.gif
Chcę, aby było jak najmniej zapytań, i tak żebym minimalnie musiał zmieniać główne, żeby nie rozwalić stronicowania, ani nie mieć takich sytuacji, że pobieram 20 wiadomości, ale wyświetlę tylko 10 bo niektóre odrzuce.

Cytat(Rysh @ 21.06.2012, 23:25:59 ) *
Jeżeli dobrze rozumuję, to powinieneś osiągnąć to za pomocą ORDER BY i GROUP.


Problem w tym, jak to pogodzić w jednym zapytaniu?
Rysh
Tu może być ciężko, może któryś z wyjadaczy forumowych Ci podpowie - bo ja pomysłu nie mam (a raczej doświadczenia).
Bo jeśli pogrupujesz wg. ID_Konwersacji to zgrupuje Ci również pozycję w których == NULL, a Ty nie chcesz tych pozycji grupować.
smietek
Cytat(Rysh @ 21.06.2012, 23:32:55 ) *
Tu może być ciężko, może któryś z wyjadaczy forumowych Ci podpowie - bo ja pomysłu nie mam (a raczej doświadczenia).
Bo jeśli pogrupujesz wg. ID_Konwersacji to zgrupuje Ci również pozycję w których == NULL, a Ty nie chcesz tych pozycji grupować.


Jest jeszcze możliwość pobrania w subquery najwyższego ID dla danego ID_Konwersacji, ale mam już jedno takie zapytanie (co prawda bardzo rzadko odpalane, dlatego je zostawiłem) i po nim widzę, że nie jest ono zbyt optymalnie zbudowane.
Rysh
BTW: możesz mi wytłumaczyć do czego to by miało służyć? Bo nie rozumiem Twojego zamysłu smile.gif
smietek
Cytat(Rysh @ 22.06.2012, 00:01:14 ) *
BTW: możesz mi wytłumaczyć do czego to by miało służyć? Bo nie rozumiem Twojego zamysłu smile.gif


Łączenie konkretnych rozmów między użytkownikami w wątki - wyświetlam tylko ostatnią wiadomość z wątku, a jeśli użytkownik chce zobaczyć resztę, to klika "rozwiń" i ładuję mu cały wątek przez AJAXa.
I już chyba wpadłem na pomysł jak to rozwiązać, ale będzie do tego potrzebne dodatkowe pole.
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.