我在MySQL数据库中有一个如下所示的表:
id | name
1 | 1 some words
2 | 2 some other words
3 | 1.1 some other words
...
10 | 10 some other words
如果我使用以下方法对表格进行排序:
$this->db->select('*')
->order_by('name', 'ASC')
->get('table_name');
我按以下顺序收到表格:
id | name
1 | 1 some words
3 | 1.1 some other words
10 | 10 some other words
...
2 | 2 some other words
但我实际上想按此顺序收到表格:
id | name
1 | 1 some words
3 | 1.1 some other words
2 | 2 some other words
...
10 | 10 some other words
使用以下SQL语句可以实现:
SELECT * FROM database_name.table_name ORDER BY name + 0 ASC;
但是如果我像这样使用codeIgniters查询构建器,我会收到数据库错误:
$this->db->select('*')
->order_by('name + 0', 'ASC')
->get('table_name');
请注意,在我的情况下,无法将数字存储在不同的列中,也不能按ID存储。
那么有没有办法让这个SQL语句在CodeIgniters查询构建器中起作用?
SELECT * FROM database_name.table_name ORDER BY name + 0 ASC;
提前致谢
修改 我很抱歉这个混乱,但是'。'在1.1中并不是一个浮点,而是像在1.1.1,1.1.2,1.1.3中的点 我找到了一个使用@Marc B解决方案的解决方案,并将其放入查询构建器中,如下所示:
$query = $this->db->select('name+0 AS name', FALSE)
->order_by('name', 'ASC')
->get('table_name');
非常感谢你的回答
答案 0 :(得分:2)
使用派生字段和别名?
SELECT name+0 AS fakename ...
ORDER BY fakename
答案 1 :(得分:2)
我认为你应该先按照号码然后按文字排序。
<强>演示:强>
SET @str := '1.1 some other words';
SELECT
SUBSTRING_INDEX(@str,' ',1)+0 AS numberPart,
SUBSTRING_INDEX(@str,SUBSTRING_INDEX(@str,' ',1),-1) AS textPart;
<强>输出:强>
numberPart textPart
1.1 some other words
以下是完整查询:
SELECT
*
FROM database_name.table_name
ORDER BY SUBSTRING_INDEX(name,' ',1)+0,
SUBSTRING_INDEX(name,SUBSTRING_INDEX(name,' ',1),-1);
或者您可以尝试将数字字符串转换为十进制类型。
答案 2 :(得分:0)
试试这个。
<强>被修改强>
$this->db->select('*')
->order_by('CAST(name AS DECIMAL(10,6)) ASC')
->get('table_name');
答案 3 :(得分:0)
将第一个字符串(以@ 1000111为例)和CAST
提取到DECIMAL
,并带有一位小数:
SELECT id
, name
FROM table_name
ORDER BY CAST(SUBSTRING_INDEX(name,' ',1) AS DECIMAL (8,1))
;
在CodeIgniter中,它看起来像这样:
$this->db->select('*')
->order_by('CAST(SUBSTRING_INDEX(name,' ',1) AS DECIMAL (8,1))', 'ASC')
->get('table_name');
如果标题包含更多小数位,则更改DECIMAL定义。例如,如果你有1.15和1.17,那么你需要两个小数位,所以你要把它改成DECIMAL(9,2)。
答案 4 :(得分:0)
使用
$this->db->order_by('fieldname + 0 ','',false,false);
这对我来说适用于Codeigniter版本3
答案 5 :(得分:0)
$this->db->select('*');
$this->db->order_by('sum(fieldname)', 'ASC');