![]() |
![]() |
![]()
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:
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 13.10.2025 - 18:12 |