我需要在MySQL查询中按顺序订购一些信息。只有当第一个字符是数字时才有可能使用ABS功能吗?
伪示例:
SELECT * FROM table
ORDER BY
(( name[0] = numeric ) ? ABS(name) : name)
ASC
感谢您到目前为止的答案,尝试了很多答案,但我没有得到我想要的结果。
当前代码:
<?php
$filters = $this->db->query("
SELECT
tb_spec_feature.feature_id,
tb_spec_feature.name
FROM
tb_spec_feature
WHERE
filter=1
");
$filters = $filters->result_array();
foreach($filters as $key=>$filter)
{
$filters_sub = $this->db->query("
SELECT DISTINCT
tb_spec_value.value_id,
tb_spec_value.name as value_name,
tb_spec_sign.name as sign_name
FROM
tb_spec_fk
INNER JOIN
tb_spec_value
ON
tb_spec_value.value_id = tb_spec_fk.value
LEFT JOIN
tb_spec_sign
ON
tb_spec_sign.sign_id = tb_spec_fk.sign
WHERE
feature=".$this->db->escape($filter['feature_id'])."
ORDER BY
ABS(tb_spec_value.name) ASC
");
$filters[$key]['values'] = $filters_sub->result_array();
}
?>
这将输出(tb_spec_feature.name,然后是tb_spec_value.name):
屏幕英寸
解决
操作系统
正如您所看到的那样,英寸和分辨率都可以,但操作系统的排序并不理想。如果我删除ABS,结果将是:
屏幕英寸
解决
操作系统
正如您现在所看到的,操作系统排序很好,但英寸和分辨率不是......我希望有人可以帮助我:)
答案 0 :(得分:3)
此代码是您问题的MySql方式:
SELECT * FROM table
ORDER BY
CASE WHEN LEFT(name, 1)>='0' AND LEFT(name, 1)<='9' THEN ABS(name)
ELSE name
END ASC
(修改强>)
但根据评论,对你来说更好:
ORDER BY ABS(name), name
以这种方式工作:
如果ABS()可以应用于'name',则数字结果值将被排序,但在相反的情况下,如果ABS(name)求值为null(因为非数字没有abs值)则第二个字段(名称)按顺序排列,与排序有关。
答案 1 :(得分:0)
试试这个: -
CASE WHEN LEFT(name[0], 1) LIKE [0-9] then ABS(name) ELSE name END
假设name
为numeric
答案 2 :(得分:0)
你可以使用转换功能:
SELECT * FROM table ORDER BY CONVERT(name, SIGNED)
将所有非数字转换为0,因此您可以安全地将其结果传递给假设整数参数的函数:
ABS(CONVERT(name, SIGNED))
答案 3 :(得分:0)
知道了!但是,不是用SQL .. 我从查询中删除了ABS,在处理查询时我使用了这个:
<?
function order_it($a,$b)
{
return $a["value_name"] - $b["value_name"];
}
foreach($filters as $key=>$filter)
{
if(isset($filter['values'][0]['value_name'][0]) AND is_numeric($filter['values'][0]['value_name'][0]))
{
usort($filter['values'],'order_it');
}
foreach($filter['values'] as $item)
{
echo $item['value_name'].'<br />';
}
}
?>
现在一切都正确订购了:)