我已经读过在分拣之前发生了分组,有没有什么方法可以在分组之前先订购,而不必将我的整个查询包装在另一个查询中来执行此操作?
假设我有这些数据:
id | user_id | date_recorded
1 | 1 | 2011-11-07
2 | 1 | 2011-11-05
3 | 1 | 2011-11-06
4 | 2 | 2011-11-03
5 | 2 | 2011-11-06
通常,我必须执行此查询才能获得我想要的内容:
SELECT
*
FROM (
SELECT * FROM table ORDER BY date_recorded DESC
) t1
GROUP BY t1.user_id
但我想知道是否有更好的解决方案。
答案 0 :(得分:1)
您的问题有点不清楚,但我怀疑您真正想要的不是任何GROUP
聚合,而是先按日期排序,然后是用户ID:
SELECT
id,
user_id,
date_recorded
FROM tbl
ORDER BY date_recorded DESC, user_id ASC
这将是结果。请注意date_recorded
从原始示例重新排序
id | user_id | date_recorded
1 | 1 | 2011-11-07
3 | 1 | 2011-11-06
2 | 1 | 2011-11-05
5 | 2 | 2011-11-06
4 | 2 | 2011-11-03
更新
要检索每个user_id的完整最新记录,需要JOIN
。子查询(mx
)找到每个user_id的最新date_recorded,并将该结果连接到整个表以检索剩余的列。
SELECT
mx.user_id,
mx.maxdate,
t.id
FROM (
SELECT
user_id,
MAX(date_recorded) AS maxdate
FROM tbl
GROUP BY user_id
) mx JOIN tbl t ON mx.user_id = t.user_id AND mx.date_recorded = t.date_recorded
答案 1 :(得分:0)
我只是使用这种技术
“在group_concat子句中插入订单子句”
SELECT SUBSTRING_INDEX(group_concat(cast(id as char)
ORDER BY date_recorded desc),',',1),
user_id,
SUBSTRING_INDEX(group_concat(cast(`date_recorded` as char)
ORDER BY `date_recorded` desc),',',1)
FROM data
GROUP BY user_id