lou*_*356 5 mysql query order-by mysql-5.1
http://sqlfiddle.com/#!9/c82c87b/1
首先,这是我的表:
CREATE TABLE `stackoverflow` (
`id` VARBINARY( 36 ) NOT NULL COMMENT 'GUID generated by PHP',
`time` TIME NOT NULL COMMENT 'Current time(stamp)',
`type` VARCHAR( 10 ) NOT NULL COMMENT 'start/stop',
`reference` VARBINARY( 36 ) NOT NULL COMMENT 'multiple starts/stops to one reference',
PRIMARY KEY ( `id` )
) ENGINE = MYISAM
Run Code Online (Sandbox Code Playgroud)
这是一些示例数据:
INSERT INTO `stackoverflow` (
`id` ,
`time` ,
`type` ,
`reference`
)
VALUES
('03bd8e91-b9aa-4d18-be47-9e9cce903cfd', '11:00:00', 'start', '76afe924-08aa-431b-904a-66290c50da6a'),
('ef10860a-7666-4ca0-95b6-79ef2d5b3f75', '11:01:00', 'start', 'fd064ef5-462f-489c-ae14-3cb766eb80c4'),
('9bc72e24-a0d4-43a3-86ab-973c331e2958', '11:02:00', 'stop', 'fd064ef5-462f-489c-ae14-3cb766eb80c4'),
('a245cda3-1196-4dba-832e-0474fd0eb0bf', '11:03:00', 'start', '05324e7b-a358-48bb-9779-08cf60038bb8'),
('488c67e6-c21d-4356-9578-49e857259345', '11:06:00', 'stop', '76afe924-08aa-431b-904a-66290c50da6a'),
('11c0e4ac-e7e9-418a-841f-650ced3e8343', '11:12:00', 'stop', '05324e7b-a358-48bb-9779-08cf60038bb8');
Run Code Online (Sandbox Code Playgroud)
它基本上是关于计时器的 - 每个计时器(参考)都有多个启动和停止。每个条目要么是开始,要么是停止。
要在 HTML 中显示这些计时器,我需要对数据进行排序:
SELECT * FROM stackoverflow ORDER BY reference DESC, time ASC;
Run Code Online (Sandbox Code Playgroud)
结果如下所示:
ef10860a-7666-4ca0-95b6-79ef2d5b3f75 11:01:00 start fd064ef5-462f-489c-ae14-3cb766eb80c4
9bc72e24-a0d4-43a3-86ab-973c331e2958 11:02:00 stop fd064ef5-462f-489c-ae14-3cb766eb80c4
# 03bd8e91-b9aa-4d18-be47-9e9cce903cfd 11:00:00 start 76afe924-08aa-431b-904a-66290c50da6a
# 488c67e6-c21d-4356-9578-49e857259345 11:06:00 stop 76afe924-08aa-431b-904a-66290c50da6a
a245cda3-1196-4dba-832e-0474fd0eb0bf 11:03:00 start 05324e7b-a358-48bb-9779-08cf60038bb8
11c0e4ac-e7e9-418a-841f-650ced3e8343 11:12:00 stop 05324e7b-a358-48bb-9779-08cf60038bb8
Run Code Online (Sandbox Code Playgroud)
如何将标有#的行放到第一个位置?
我认为按引用排序是错误的,但我如何将它们放在一起?只是按时间排序会产生错误的结果。如果这对引用可以保持在一起,那就太好了。
我需要虚拟表还是子查询?
同时我用多个单独的 SQL 操作在 PHP 中修复了这个“'SQL'问题”,详细如下:
获取所有参考
SELECT DISTINCT reference FROM stackoverflow;
Run Code Online (Sandbox Code Playgroud)对于每个参考
SELECT * FROM stackoverflow WHERE reference = :reference ORDER BY time;
Run Code Online (Sandbox Code Playgroud)对于每一行 -> 生成 HTML“计时器”
结果:
# 03bd8e91-b9aa-4d18-be47-9e9cce903cfd 11:00:00 start 76afe924-08aa-431b-904a-66290c50da6a
# 488c67e6-c21d-4356-9578-49e857259345 11:06:00 stop 76afe924-08aa-431b-904a-66290c50da6a
ef10860a-7666-4ca0-95b6-79ef2d5b3f75 11:01:00 start fd064ef5-462f-489c-ae14-3cb766eb80c4
9bc72e24-a0d4-43a3-86ab-973c331e2958 11:02:00 stop fd064ef5-462f-489c-ae14-3cb766eb80c4
a245cda3-1196-4dba-832e-0474fd0eb0bf 11:03:00 start 05324e7b-a358-48bb-9779-08cf60038bb8
11c0e4ac-e7e9-418a-841f-650ced3e8343 11:12:00 stop 05324e7b-a358-48bb-9779-08cf60038bb8
Run Code Online (Sandbox Code Playgroud)订单现在如预期的那样 - 如果有一个 MySQL 解决方案,它仍然会很棒。:)
注意:确切的 MySQL 版本是5.1.61。
SELECT s.*
FROM stackoverflow s, ( SELECT reference, MIN(time) time
FROM stackoverflow
GROUP BY reference
) o
WHERE s.reference = o.reference
ORDER BY o.time ASC, reference DESC, time ASC;
Run Code Online (Sandbox Code Playgroud)
一切都很简单。您希望按组中最旧记录的日期时间对组进行排序。子查询获取此信息,并通过将其连接到组中的每个记录来在主查询中使用它。为了理解输出中的替换s.*
并*
分析结果。