Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Niewlasciwe grupowanie wynikow
Forum PHP.pl > Forum > Bazy danych > MySQL
misty
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:

  1. SELECT depth, table_2_id, time
  2. FROM table_1
  3. WHERE 1
  4. AND table_2_id IN (842,53,161,63,27,55,49,29,43,37,17,45,47,57,25,21,149,41,61,89,73,69,99,67,153,119)
  5. AND time = (
  6. SELECT max( time)
  7. FROM table_1
  8. WHERE table_2_id IN (842,53,161,63,27,55,49,29,43,37,17,45,47,57,25,21,149,41,61,89,73,69,99,67,153,119)
  9. )
  10.  
  11. GROUP BY table_2_id


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
pmir13
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:

  1. SELECT t1.depth, t1.table_2_id, t1.time
  2. FROM
  3. table_1 t1
  4. JOIN
  5. ( SELECT table_2_id, MAX(time) AS latest
  6. FROM table_1
  7. WHERE table_2_id IN (842,53,161,63,27,55,49,29,43,37,17,45,47,57,25,21,149,41,61,89,73,69,99,67,153,119)
  8. GROUP BY table_2_id ) t2
  9. ON t1.table_2_id = t2.table_2_id AND t1.time = t2.latest


Przy indeksie na parę (table_2_id,time) będzie działać dosyć sprawnie.
misty
Dzieki, bardzo mi pomogles. Przyznam ze sama bym nie wpadla na takie zapytanie, nie wiedzialam ze mozna robic takie sprytne joiny! smile.gif

pzdr,
misty
alegorn
optymalniej bedzie jak rozbijesz to na dwa etapy.
tzn zapytanie z subquery wykonac wczesniej.
j.
misty
dzieki, przetestuje wyniki. Tak czy siak nawet w 1 zapytaniu, po zalozeniu indeksu na (table_2_id, time) wyniki sa na prawde zadowalajace!
alegorn
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.
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.