Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 22.11.2008 Ostrzeżenie: (0%)
|
Witam, wiem że temat był dużo razy poruszany ale nadal nie potrafię zastosować go do swoich potrzeb.
Mam tabelę:
i chcę wyciągnąć najświeższą wiadomość dla id uzytkownika="30" , gdzie grupowanie jest po polu "grupa", a najświeższa wiadomość to ta, która ma największe "id".
wyciąga mi
a potrzebne
jakiś pomysł? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%)
|
Sam fakt, że taka składnia nie przejdzie na sql serverze czy oracle oznacza też że są inne, bardzo wydajne sposoby uzyskiwania potrzebnych danych.
Wracając jednak do tego o co chodzi prawdopodobnie autorowi wątku, najrozsądniejsze wydaje się być najpierw prawidłowe pogrupowanie:
Obie kolumny wchodzące do selecta są prawidłowe, bo grupa jest w GROUP BY, a max jest funkcją agregującą. To jest bardzo szybkie zapytanie przy prawidłowo ustawionych indeksach. Choćby wiadomości było miliony where na starcie ograniczy to do wiadomości dotyczących pojedynczego użytkownika, a rezultat to bardzo mała tabela, zawierająca tylko tyle rekordów ile jest różnych grup (ile może być grup wiadomości?). Teraz mając najświeższe wiadomości dla danej grupy możemy połączyć to z powrotem z tą samą tabelą po to by wydobyć dane wiadomości korzystając z faktu, że id jednoznacznie identyfikuje rekord, więc łaczymy po prostu po id<->najswiezsza. Łączymy kilka rekordów z ewentualnie bardzo dużą tablicą, ale po kluczu primary, czyli w najszybszej konfiguracji, więc również będzie bardzo szybko. Ostatecznie otrzymujemy zapytanie, które będzie sprawnie działać na BARDZO dużej bazie wiadomości:
|
|
|
|
menda90 Problem z sortowaniem przed grupowaniem 27.04.2011, 17:03:46
pmir13 Dlaczego potrzebujesz grupowania?
Używanie w sele... 27.04.2011, 20:34:55
thek Mysql w takich wypadkach jak podałeś zwraca wartoś... 28.04.2011, 08:49:56 
pmir13 Cytat(thek @ 28.04.2011, 09:49:56 ) M... 28.04.2011, 09:41:25
thek pmir: To że przeczy dokumentacji, nie znaczy że My... 28.04.2011, 10:26:34 ![]() ![]() |
|
Aktualny czas: 31.12.2025 - 16:30 |