MySQL GROUP BY и есть - PullRequest
       22

MySQL GROUP BY и есть

13 голосов
/ 25 февраля 2011

Я группирую свои результаты на основе столбца X и хочу вернуть строки, которые имеют наибольшее значение столбца Y в группе.

SELECT * 
FROM   mytable 
GROUP  BY col1 
HAVING col2 >= (SELECT MAX(col2) 
                FROM   mytable AS mytable2 
                WHERE  mytable2.col1 = mytable.col1 GROUP BY mytable2.col1) 

Я хочу оптимизировать запрос выше. Это выполнимо без подзапросов?

Я нашел решение, и оно проще, чем вы думаете:

SELECT * FROM (SELECT * FROM mytable ORDER BY col2 DESC) temp GROUP BY col1

Запускается за 5 миллисекунд на 20000 строк.

Ответы [ 2 ]

13 голосов
/ 25 февраля 2011

Использование производной таблицы / встроенного представления для JOIN:

SELECT x.* 
  FROM mytable x
  JOIN (SELECT t.col1,
               MAX(t.col2) AS max_col2
          FROM MYTABLE t
      GROUP BY t.col1) y ON y.col1 = x.col1
                        AND y.max_col2 >= x.col2

Имейте в виду, что это дублирует записи x, если существует более одной связанной записи y. Чтобы удалить дубликаты, используйте DISTINCT:

SELECT DISTINCT x.* 
  FROM mytable x
  JOIN (SELECT t.col1,
               MAX(t.col2) AS max_col2
          FROM MYTABLE t
      GROUP BY t.col1) y ON y.col1 = x.col1
                        AND y.max_col2 >= x.col2

Следующее не проверено, но не будет возвращать дубликаты (при условии действительного):

SELECT x.* 
  FROM mytable x
 WHERE EXISTS (SELECT NULL
                 FROM MYTABLE y
                WHERE y.col1 = x.col1
             GROUP BY y.col1
               HAVING MAX(y.col2) >= x.col2)
1 голос
/ 11 марта 2014

Ваш Col2 никогда не будет> затем MAX (col2), поэтому я предлагаю использовать col2 = MAX (col2)

так вот ЗАПРОС

SELECT * FROM  mytable GROUP BY col1 HAVING  col2 = MAX(  col2 ) 
...