排序表id';s被连字符截断(PHP/MySQL)
我有一个MySQL表,我想以递减的方式显示它。问题是ID被破折号打断了。。。所以MySQL不理解我的请求排序表id';s被连字符截断(PHP/MySQL),php,mysql,Php,Mysql,我有一个MySQL表,我想以递减的方式显示它。问题是ID被破折号打断了。。。所以MySQL不理解我的请求 SELECT * FROM table WHERE id ORDER BY id DESC 结果 20633-18489 184945-190028 183661-188782 1575-1610 但是我要这个订单 184945-190028 183661-188782 20633-18489 1575-1610 php中的解决方案是什么?在SQL语句中,我们可以这样做: ORDER
SELECT * FROM table WHERE id ORDER BY id DESC
结果
20633-18489
184945-190028
183661-188782
1575-1610
但是我要这个订单
184945-190028
183661-188782
20633-18489
1575-1610
php中的解决方案是什么?在SQL语句中,我们可以这样做:
ORDER BY id + 0 DESC
或者这个:
ORDER BY SUBSTRING_INDEX(id,'-',1) + 0 DESC
“+0
”将导致在数字上下文中对其前面的字符串求值。这将返回一个数字。然后按数值排序
作为示范
SELECT t.id
, t.id + 0 AS id0
, SUBSTRING_INDEX(t.id,'-',1)+0 AS id1
FROM ( SELECT '184945-190028' AS id
UNION ALL SELECT '183661-188782'
UNION ALL SELECT '20633-18489'
UNION ALL SELECT '1575-1610'
) t
ORDER BY t.id + 0 DESC
返回
id id0 id1
------------- ------ ------
184945-190028 184945 184945
183661-188782 183661 183661
20633-18489 20633 20633
1575-1610 1575 1575
注意:这仅在仪表板前面的
id
部分订购。这并没有指定在前导部分上“匹配”的订单id值将以何种形式返回。MySQL可以任意顺序返回这两个
456-42
456-321
我们可以在ORDER BY子句中添加更多表达式,使这些表达式的顺序具有确定性。您需要的是
REPLACE()
函数
因此,您的查询如下所示:
SELECT *, REPLACE(id, '-' , '') AS sortable_id WHERE id ORDER BY sortable_id DESC
这将按字符(字符串)值排序,不符合OP规范。@spencer7593我在原始问题中看不到任何关于要求的内容。我不确定排序前从字符串到整数的转换是否比基于字符串值的排序快。你能详细说明一下我的回答/推理有什么问题吗[我想知道如何改进]@YouriKoeman:看看OP指定的“我想要这个顺序”,看看字符串
18..
,20…
,15…
,如果我们按字符串降序排序,我们将得到20…
,18…
,15…
。OP希望返回值的顺序看起来像是按数值。。。与数值相比,20633小于183661。与字符串相比,“20xxx”大于“18xxx”。(在本例中,如果一种方法的速度比另一种方法快,或者其中一种方法没有按我们想要的顺序返回行,则这并不重要。)