我想将sub_prd_id
以下的数据分组。但在此之前,我需要最大 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
答案 0 :(得分:4)
您要完成的任务称为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上查看。
答案 1 :(得分:2)
你的预感是正确的。这样就可以了:
select * from
(select * from prd_data order by created_at desc) x
group by sub_prd_id
请注意,这是一个仅限mysql的解决方案,但由于问题标记为mysql应该没问题。当只有某些的非聚合列被分组时,Mysql具有关于组的特殊功能:而所有其他数据库都不允许这样做,mysql返回每个遇到的第一行行独特的组合。通过在分组之前对进行排序,可以获得每个sub_prd_id的最新created_at值的行。
答案 2 :(得分: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;
答案 3 :(得分:0)
查询(总是有效,但比其他查询慢):
<强> 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 |