是否有“软” ORDER BY / GROUP BY?

lou*_*356 5 mysql query order-by mysql-5.1

SQL-小提琴

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'问题”,详细如下:

  1. 获取所有参考

    SELECT DISTINCT reference FROM stackoverflow;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于每个参考

    SELECT * FROM stackoverflow WHERE reference = :reference ORDER BY time;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 对于每一行 -> 生成 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

Aki*_*ina 4

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.**分析结果。