2014-10-28 71 views
0

我有一个SQL查询的问题。我希望我的结果按升序排序,但问题是DB只按照第一个数字对结果进行排序,而逻辑上,2应该在19之前。SQL Order by ... ASC

这里是我的请求,其结果不走所有的截图:

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

Very bad sort...

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

你对这个问题有想法吗?

问候。

+0

我猜你切除了与敏感数据的一部分,但它似乎是你的记录是由管道分隔的数据串charachter。你首先只需要把第一个管道前面的部分转换为int,或者只是找到管道的位置“i”并且在字符串和字母顺序之前连接ni零,其中“n”足够大以产生一个结果字符串比第一列中的任何值都大。 – BertuPG 2014-10-28 13:12:17

回答

1

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

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

完美,它能正常工作,非常感谢!我知道了! ;) – 2014-10-28 13:03:35

1

据我所看到的现场是一个varchar /文本......所以他们正确地排序,你就必须投领域(如果可能)

例子:

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

非常好的主意非常感谢!我得到了错误! :D – 2014-10-28 13:04:11

3

不会这样做。您有字符串/字符[]列,并且您只查找有关数字的作品。 如果可能,您需要将此列转换为数字。

您可以使用转换:

CAST(mail.titre,int) 

例子在这里: Converting text column to integer in MySQL

+0

好主意,@Jens找到完美的查询,就像你一直在说你和罗伯特一样! :d – 2014-10-28 13:05:40