2

我想对以下数据进行分组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
4

4 回答 4

6

您要完成的任务称为groupwise maximum,使用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

sqlfiddle上查看。

于 2013-04-28T08:33:21.887 回答
2

你的预感是正确的。这将使它:

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

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

于 2013-04-28T08:53:37.400 回答
1
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;
于 2013-04-28T15:08:33.517 回答
0

查询(将始终有效,但比其他查询慢):

SQLFIDDLE示例

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 |
于 2013-04-28T15:13:36.173 回答