MySQL GROUP BY和HAVING

Eli*_*lie 14 mysql group-by having

我正在根据列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) 
Run Code Online (Sandbox Code Playgroud)

我想优化上面的查询.没有子查询是否可行?

我找到了解决方案,它比你想象的更简单:

SELECT * FROM (SELECT * FROM mytable ORDER BY col2 DESC) temp GROUP BY col1
Run Code Online (Sandbox Code Playgroud)

在20,000行上运行5毫秒.

OMG*_*ies 13

使用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
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

以下是未经测试的,但不会返回重复项(假设有效):

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)
Run Code Online (Sandbox Code Playgroud)

  • @Elie:你有没有投票给我?我没有你的表或数据来测试速度.由你来索引表格. (2认同)