Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Pobieranie tylko ostatniego wystąpienia z danym dodatkowym ID
smietek
post
Post #1





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


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?
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #2





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


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ń.
Go to the top of the page
+Quote Post
smietek
post
Post #3





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


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)?
Go to the top of the page
+Quote Post
Ruch Radzionków
post
Post #4





Grupa: Zarejestrowani
Postów: 311
Pomógł: 25
Dołączył: 29.08.2011

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


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 (IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
Rysh
post
Post #5





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


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.

Ten post edytował Rysh 21.06.2012, 22:27:36
Go to the top of the page
+Quote Post
smietek
post
Post #6





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


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 (IMG:style_emoticons/default/questionmark.gif)


Zapytania w pętli? Nie dziękuje, to się źle skończy (IMG:style_emoticons/default/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?

Ten post edytował smietek 21.06.2012, 22:27:50
Go to the top of the page
+Quote Post
Rysh
post
Post #7





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


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ć.

Ten post edytował Rysh 21.06.2012, 22:33:39
Go to the top of the page
+Quote Post
smietek
post
Post #8





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


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.
Go to the top of the page
+Quote Post
Rysh
post
Post #9





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


BTW: możesz mi wytłumaczyć do czego to by miało służyć? Bo nie rozumiem Twojego zamysłu (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
smietek
post
Post #10





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post

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: 16.10.2025 - 23:48