【问题标题】:how to get result of order by on two columns in mysql如何在mysql中的两列上获得排序结果
【发布时间】:2014-08-15 11:59:17
【问题描述】:

我有一个包含以下数据的表格

tab1
POS     NAME    DATE
1       abc   08-08-2014
2       def   08-08-2014
1       xyz   14-08-2014
2       mno   14-08-2014
3       pqr   08-08-2014
10      tuv   08-08-2014

现在我想要如下结果:

POS     NAME DATE
1       xyz 14-08-2014
2       mno 14-08-2014
1       abc 08-08-2014
2       def 08-08-2014
3       pqr 08-08-2014
10      tuv   08-08-2014
2       rns  08-08-2014

我的逻辑是在 DESC 顺序中按日期显示所有记录 ORDER,按 ASC 顺序显示 POS

但是如果我使用 SELECT DISTINCT * FROM tab1 ORDER BY DATE DESC, POS ASC 运行查询

然后显示以下结果集:

POS     NAME DATE
1       xyz  14-08-2014
2       mno  14-08-2014
1       abc  08-08-2014
10      tuv  08-08-2014
2       def  08-08-2014
2       rns  08-08-2014
3       pqr  08-08-2014

【问题讨论】:

    标签: mysql


    【解决方案1】:

    正常

    SELECT * FROM tab1 ORDER BY `DATE` DESC, `POS` ASC
    

    做你想做的。

    但是,由于您的 POS 列是字符串(char 或 varchar),您必须将其转换为数字:

    SELECT * FROM tab1 ORDER BY `DATE` DESC, (`POS`+0) ASC
    SELECT * FROM tab1 ORDER BY `DATE` DESC, CAST(`POS` AS INT) ASC
    

    这将导致列在所有行中都转换为数字,从而导致“更差”的性能。您应该考虑将 POS 存储为数字(整数)。

    【讨论】:

    • 在您的第一个问题中,您没有指出 ID 列不是数字而是字符串(char 或 varchar)。您必须将 POS 列转换为数字,例如通过添加 +0 或其他一些强制转换。 - 这对性能不利。您的 POS 列应该是一个数字以获得最佳性能(同样适用于 DATE 列,它应该是一个特殊的日期数据类型)。
    • 感谢 MtTux 我已将 POS 更改为 INT 并将 DATE 更改为 Date 数据类型并 SELECT * FROM tab1 ORDER BY DATE DESC, POS ASC 工作不正常..我正在编辑问题,请有看看
    【解决方案2】:

    试试这个:

    Select 
    *
    from 
    myTable 
    
    order by `date` desc, CAST(POS AS INT)
    

    由于ASC是默认的,所以我的回答中没有提到

    【讨论】:

    • 当 POS 为 10 时不工作,然后在 1 之后显示 10,然后 2 后显示 10
    • @user3305327:已更新我的查询,请检查并告诉我它是否有效
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 2011-03-08
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    相关资源
    最近更新 更多