sql - MySQL:ORDER BY 未按预期工作。正确排序一些行

标签 sql mysql

我对 MySQL 没有太多经验,所以我不确定在提出这个问题时应该包含哪些信息。如果我遗漏了相关的内容,请发表评论。我会及时添加。

我有这个查询:

SELECT 
        Log_Analysis_RecordsToSesions_dalhousie.sessionID, 
        (TIMEDIFF(
                MAX(Log_Analysis_Records_dalhousie.date), 
                MIN(Log_Analysis_Records_dalhousie.date) 
        )) as NewSessionLength
FROM 
        Log_Analysis_RecordsToSesions_dalhousie, 
        Log_Analysis_Records_dalhousie
WHERE
        Log_Analysis_RecordsToSesions_dalhousie.recordID=Log_Analysis_Records_dalhousie.recordID
GROUP BY
        sessionID;

返回:

+-----------+---------------+
| sessionID | SessionLength |
+-----------+---------------+
|         1 | 00:20:31      | 
|         2 | 00:19:54      | 
|         3 | 00:04:01      | 
|         4 | 00:14:02      | 
|         5 | 00:02:16      | 
|         6 | 00:16:25      | 
|         7 | 00:00:00      | 
|         8 | 00:00:00      | 
|         9 | 00:00:00      | 
|        10 | 00:26:35      | 
|        11 | 00:11:28      | 
|        12 | 00:00:00      | 
|        13 | 00:00:00      | 
|        14 | 00:11:03      | 
  ...
|      7978 | 00:00:03      | 
|      7979 | 00:00:15      | 
|      7980 | 00:00:00      | 
|      7981 | 00:00:00      | 
+-----------+---------------+
7981 rows in set (0.92 sec)

当我追加时

ORDER BY
        NewSessionLength;

对于查询,它主要对它进行排序,但并不能 100% 正确。 大多数的大值被放在表格的末尾,大多数的小值被放在表格的开头。我不知道是什么原因造成的。

例如:

+-----------+------------------+
| sessionID | NewSessionLength |
+-----------+------------------+
|      4285 | 00:00:00         | 
|      1565 | 00:00:00         | 
|      7604 | 00:00:02         | 
|      4317 | 00:00:02         | 
|      1597 | 00:00:02         | 
|      7636 | 00:00:01         | 
|      4349 | 00:18:17         | // <-------------- Out of order
|      1629 | 00:00:09         | 
  ...
|      2829 | 04:28:01         | 
|       377 | 04:25:23         | // <-------------- Out of the order
|      5631 | 05:37:25         | 
|        18 | 05:05:31         | 
|      1545 | 07:01:31         | 
|      7536 | 07:09:59         | 
|      5237 | 10:07:29         | 
|       250 | 90:42:30         | 
+-----------+------------------+
7981 rows in set (0.94 sec)

最佳答案

在 MySQL 版本 5.0.50 中存在一个错误 ( #32202 ),当与 GROUP BY 一起使用时,ORDER BY 无法正常工作。此问题已在较新的版本中得到修复,但您可能需要尝试以下操作来查看您是否有“错误”的 MySQL 版本:

CREATE TABLE a (id int auto_increment primary key, sorter char(5));
INSERT INTO a VALUES (1, 'z'), (2, 'x'), (3, 'a'), (4, 'z');
SELECT * FROM a GROUP BY id ORDER BY sorter;

如果您获得的结果集未按sorter字段排序,那么您可能需要考虑升级数据库服务器。

如果无法升级,有一个简单的解决方法可以解决上述问题:

SELECT * FROM ( SELECT * FROM a GROUP BY id ) b ORDER BY sorter;

...在您的情况下应该如下:

SELECT * FROM 
(
    SELECT 
            Log_Analysis_RecordsToSesions_dalhousie.sessionID, 
            (TIMEDIFF(
                    MAX(Log_Analysis_Records_dalhousie.date), 
                    MIN(Log_Analysis_Records_dalhousie.date) 
            )) as NewSessionLength
    FROM 
            Log_Analysis_RecordsToSesions_dalhousie, 
            Log_Analysis_Records_dalhousie
    WHERE
            Log_Analysis_RecordsToSesions_dalhousie.recordID = 
            Log_Analysis_Records_dalhousie.recordID
    GROUP BY
            sessionID
) dt
ORDER BY NewSessionLength;

关于sql - MySQL:ORDER BY 未按预期工作。正确排序一些行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4179599/

相关文章:

sql - SQL 中的递归 - 公用表表达式与 WHILE

MySQL 查询 3 个表

php - 如何使用数据库中的(大量)记录填充 HTML 表单?

mySql 存储过程加密

mysql - 如何近似mysql行数

sql - pl/sql中双竖线的使用

MySQL JOIN 多个查询结果到 1 个结果集

sql - 将嵌套的(两个)NOT IN 转换为嵌套的(两个)NOT Exists

mysql - 替换字符串中的特定字符

MySQL查询以增加日期更新记录