Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Niewlasciwe grupowanie wynikow
misty
post 8.03.2012, 14:41:45
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:

  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
Go to the top of the page
+Quote Post
pmir13
post 10.03.2012, 13:14:30
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:

  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.
Go to the top of the page
+Quote Post
misty
post 12.03.2012, 12:01:34
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! smile.gif

pzdr,
misty
Go to the top of the page
+Quote Post
alegorn
post 12.03.2012, 14:57:00
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.
Go to the top of the page
+Quote Post
misty
post 13.03.2012, 08:27:23
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!
Go to the top of the page
+Quote Post
alegorn
post 13.03.2012, 11:27:25
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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 07:47