2012-10-02 8 views
10

Próbuję utworzyć zapytanie w tabeli zawierającej około 500 000 rekordów i około 50 lub 60 kolumn. Potrzebuję zebrać te rekordy w grupy i wybrać maksymalny rekord w każdej grupie.Wybieranie przez MySQL maks. Rekordu w grupie przez

Aby uprościć problem mam następująco

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 2 |  1004 |  2 | b  | 
| 3 |  1005 |  2 | c  | 
+----+-------------+----------+--------+ 

Prosta grupę, jest następująca

select * from temp GROUP BY group_id 

która zwraca

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 2 |  1004 |  2 | b  | 
+----+-------------+----------+--------+ 

Ładne, ale nie to, co chcę tabelę . To, czego chcę, to cały rekord dla max enternal_id w każdej grupie. Innymi słowy

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 3 |  1005 |  2 | c  | 
+----+-------------+----------+--------+ 

Jakoś szukam umieścić max (external_id) oświadczenie tu do filtrowania, co jest potrzebne, ale do tej pory wszystkie moje dochodzenie nie powiodło się. Pewne wskazówki będą mile widziane. Ważne jest, aby zwracając max (external_id), że cały rekord został wybrany jako kolumna ścieżki różni się.

+0

Być może za pomocą "wybierz MAX (external_id) jako maksimum, * z GROUP BY temp group_id" można to zrobić. – PiLHA

Odpowiedz

19

Dużo informacji na http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

To zawsze był przykry problem w MySQL. Były na to sposoby, takie jak łączenie kilku pól razem (zaczynając od external_id), a następnie wybierając MAX() tego, a następnie rozbijając je z powrotem.

Proponuję użyć wyprowadzonej tabeli. Pierwsza tabela (t1) pochodzi z prostej kwerendy, w której identyfikujesz MAX(external_id), następnie dołączasz do niej, aby uzyskać resztę danych.

to tylko IF external_id jest wyjątkowy

SELECT 
    t1.group_id, some_table.id, some_table.mypath 
FROM 
    (
     SELECT group_id, MAX(external_id) AS external_id 
     FROM some_table 
     GROUP BY group_id 
    ) as t1 
INNER JOIN 
    sometable ON t1.external_id = sometable.external_id 
WHERE ... 
+0

Tak, masz rację. Zmiana problemu jest najlepszym sposobem, powinienem postępować zgodnie z zasadą "jeśli masz problem, którego nie możesz rozwiązać, zmień go na taki, który możesz". Przy odpowiednich indeksach działa dobrze. – user1715656

+0

Drobne pytanie, ale czy istnieje powód, dla którego wybrałeś wybór t1.group_id zamiast some_table.group_id? Czy jest bardziej wydajny? –