MySQL查询排序数据的两种方式

Posted

技术标签:

【中文标题】MySQL查询排序数据的两种方式【英文标题】:MySQL query ordering data two ways 【发布时间】:2009-05-07 15:16:23 【问题描述】:

我正在使用下表跟踪模块内的页面浏览量:

id | page_id | user_id | session_id | created

每个页面对于某个模块来说都是唯一的;例如,第 14 页仅存在于模块 2 中。

我正在尝试编写一个查询,告诉我某个特定模块的查看会话何时开始 (GROUP BY session_id),但我在订购时遇到了问题。基本上,对于那个分组会话,我想返回最早的“创建”(查看会话的开始时间)和最新的 page_id(他们在模块中的距离)。

最好的方法是什么?

【问题讨论】:

能否提供一些示例数据和所需的结果集? 【参考方案1】:

我认为您需要在选择中使用子查询:

SELECT a.session_id, MIN(a.created) as start_time, 
b.page_id AS last_page, b.end_time
FROM table a 
INNER JOIN 
   (SELECT b.session_id, MAX(b.created) as end_time, MAX(b.page_id) 
   FROM table b GROUP BY b.session_id) 
ON a.session_id = b.session_id GROUP BY a.session_id

【讨论】:

【参考方案2】:
SELECT  MIN(created), MAX(page_id)
FROM    modules
GROUP BY
        session_id

【讨论】:

我不相信这会显示出预期的结果——我认为 MAX(page_id) 需要与上次创建时间相对应。 @BrynJ:基于 OP 对“他们在模块中的进展程度”的定义,@Quassnoi 仍然是正确的。

以上是关于MySQL查询排序数据的两种方式的主要内容,如果未能解决你的问题,请参考以下文章

mysql 分组总和求最大值 的两种方式

oracle查询前N条数据的两种方式

MySQL关闭查询缓存(QC)的两种方法

Mysql数据查询in的时候如何排序

MySQL 常见面试题

MySQL分页查询limit优化的两种思路