【问题标题】:SQL Order by ... ASCSQL Order by ... ASC
【发布时间】:2014-10-28 12:56:47
【问题描述】:

我的 SQL 查询有问题。我希望我的结果按升序排序,但问题是数据库只根据第一个数字对我的结果进行排序,而从逻辑上讲,例如 2 应该在 19 之前。

这是我的请求和完全不成功的结果截图:

SELECT * FROM mail WHERE titre LIKE '%$mot%' ORDER BY mail.titre ASC

我想要的是所有这样排序的结果:1 2 3 4 5 ... 101 102 103 ... 8845 8850 ... 等等。

你对这个问题有什么想法吗?

问候。

【问题讨论】:

  • 我猜你用敏感数据切除了部分,但你的记录似乎是字符串,数据由管道字符分隔。您必须首先只取第一个管道之前的部分并将其转换为 int,或者只需找到管道的位置“i”并在字符串之前连接 n-i 个零并按字母顺序排列,其中“n”足够大以产生结果字符串大于第一列中的任何值。

标签: php mysql sql sorting sql-order-by


【解决方案1】:

不会。您有 string/char[] 列,并且您正在寻找的订单仅适用于数字。 如果可能,您需要将此列转换为数字。

你可以使用演员表:

CAST(mail.titre,int)

示例如下: Converting text column to integer in MySQL

【讨论】:

  • 好主意,@Jens 找到了完美的查询,就像你一直在说你和罗伯特一样! :D
【解决方案2】:

我认为你的专栏被标为char。所以 DBMS 是按字符串值排序的。您必须在 sort 子句中将值转换为 int。

SELECT * FROM mail WHERE titre LIKE '%$mot%' ORDER BY convert(mail.titre, unsigned integer) ASC

【讨论】:

  • 完美,它工作正常,非常感谢!我得到了它! ;)
【解决方案3】:

据我所知,该字段是 varchar/text...所以要正确排序它们,您必须强制转换该字段(如果可能)

例子:

SELECT * FROM mail WHERE titre LIKE '%$mot%' ORDER BY CAST(mail.titre AS int) ASC

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 2017-01-20
    • 2020-03-09
    • 2020-02-19
    • 1970-01-01
    • 2016-12-31
    • 2011-08-24
    • 2011-02-22
    • 2019-06-09
    相关资源
    最近更新 更多