如何订购'名称+ 0'在codeIgniter(mysql)中

时间:2016-08-18 19:16:13

标签: php mysql codeigniter codeigniter-3

我在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');

非常感谢你的回答

6 个答案:

答案 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);

See demo

或者您可以尝试将数字字符串转换为十进制类型。

See Demo

答案 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');