在mysql中,在group by之前对数据进行排序(order by)



我想从sub_prd_id分组以下数据。但在此之前,我需要从max created_at的订单数据。

我写的查询如下。

select * FROM prd_data group by sub_prd_id order by created_at desc

但是这个查询没有返回我需要的。例如,根据下面的数据,查询执行后,结果应该如下所示,

id  name    sub_prd_id  created_at
4   Grape     10            2013-04-28 03:11:55
6   Banana    11            2013-04-28 03:23:14
7   Pineapple 12            2013-04-28 03:23:44

表结构与数据

id  name    sub_prd_id  created_at
2   Apple     10            2013-04-28 03:04:51
3   Orange    10            2013-04-28 03:08:19
4   Grape     10            2013-04-28 03:11:55
5   Mango     11            2013-04-28 03:22:48
6   Banana    11            2013-04-28 03:23:14
7   Pineapple 12            2013-04-28 03:23:44

您要完成的是所谓的组最大,这是无法实现使用ORDER BY。相反,必须找到MAX(),然后将结果连接回表:

SELECT prd_data.* FROM prd_data NATURAL JOIN (
  SELECT   sub_prd_id, MAX(created_at) created_at
  FROM     prd_data
  GROUP BY sub_prd_id
) t

你的预感是对的。这将使它:

select * from
  (select * from prd_data order by created_at desc) x
group by sub_prd_id

请注意,这是mysql唯一的解决方案,但由于问题被标记为mysql,应该是OK的。Mysql对于group by有特殊的功能,当只有一些的非聚合列被分组时:然而所有其他数据库不允许这样做,Mysql返回每个唯一组的第一个行。通过在分组之前对进行排序,您可以获得每个sub_prd_id具有最新created_at值的行。

SELECT x.* 
  FROM prd_data x 
  JOIN 
     ( SELECT sub_prd_id
            , MAX(created_at) max_created_at 
         FROM prd_data 
        GROUP 
           BY sub_prd_id
     ) y 
    ON y.sub_prd_id = x.sub_prd_id 
   AND y.max_created_at = x.created_at;

查询(将始终工作,但比其他查询慢):

SQLFIDDLEExample

SELECT t1.*
FROM prd_data t1
WHERE t1.id = (SELECT t2.id
               FROM prd_data t2
               WHERE t2.sub_prd_id= t1.sub_prd_id
               ORDER BY t2.created_at DESC
               LIMIT 1)

其他查询(仅当sub_prd_id有一个MAX值时才有效):

SELECT t1.*
FROM prd_data t1
WHERE t1.created_at = (SELECT MAX(t2.created_at)
                       FROM prd_data t2
                       WHERE t2.sub_prd_id= t1.sub_prd_id)
结果:

| ID |      NAME | SUB_PRD_ID |                   CREATED_AT |
--------------------------------------------------------------
|  4 |     Grape |         10 | April, 28 2013 03:11:55+0000 |
|  6 |    Banana |         11 | April, 28 2013 03:23:14+0000 |
|  7 | Pineapple |         12 | April, 28 2013 03:23:44+0000 |

最新更新