![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 366 Pomógł: 0 Dołączył: 2.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Czesc, mam nastepujacy problem - jest sobie tabela:
table_1: depth (int), table_2_id (fk do table_2), time (data) Potrzebuje wyciagnac z niej (chcialabym to zrobic 1 zapytaniem) takie dane: dla kazdego table_2_id wyciagnij depth gdzie time = max(time) - czyli dla kazdego table_2_id wyciagnac depth dla jego max czasu (tzn dla czasu max dla table_2_id, nie dla max(time) na calej tabeli). Teoretycznie zapytanie wydaje sie proste, ale cos mi nie trybi:
Zwracaja mi sie tylko 2 wyniki, mimo tego ze w tabeli istnieja wartosci dla wszystkich. Czy ktos z Was widzi moze gdzie mam blad? pzdr, misty |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
Trudno powiedzieć czy jest to błąd lub gdzie jest błąd, po prostu zapytanie robi to co ma robić, a nie ma związku z tym co opisujesz że potrzebujesz. Zapytanie zwraca tylko te rekordy, w których czas jest maksymalny dla całej puli rekordów z pasującymi table_2_id IN(...), bo taki właśnie warunek jest w ostatnim WHERE.
Jeśli jednak mamy uzyskać wartości depth dla ostatnich czasów w grupach według table_2_id, to proponuję całkowicie przepisać to zapytanie:
Przy indeksie na parę (table_2_id,time) będzie działać dosyć sprawnie. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 366 Pomógł: 0 Dołączył: 2.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Dzieki, bardzo mi pomogles. Przyznam ze sama bym nie wpadla na takie zapytanie, nie wiedzialam ze mozna robic takie sprytne joiny!
![]() pzdr, misty |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
optymalniej bedzie jak rozbijesz to na dwa etapy.
tzn zapytanie z subquery wykonac wczesniej. j. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 366 Pomógł: 0 Dołączył: 2.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
dzieki, przetestuje wyniki. Tak czy siak nawet w 1 zapytaniu, po zalozeniu indeksu na (table_2_id, time) wyniki sa na prawde zadowalajace!
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
hmm, różnice miedzy podzapytaniem a rozbiciem - zobaczysz jedynie na obciążonej maszynie.
ja develu, na którym odpalasz tylko jeden proces - prawdopodobnie będą zbliżone wartości. jeśli cie temat zainteresuje szukaj o 'wielowątkowości' mysql'a j. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 07:47 |