使用GROUP BY之前对数据进行排序?

时间:2011-11-07 15:40:37

标签: mysql group-by sql-order-by

我已经读过在分拣之前发生了分组,有没有什么方法可以在分组之前先订购,而不必将我的整个查询包装在另一个查询中来执行此操作?

假设我有这些数据:

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

但我想知道是否有更好的解决方案。

2 个答案:

答案 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