如何在codeIgniter(mysql)中按'name + 0'排序

w8f9ii69  于 2022-12-07  发布在  Mysql
关注(0)|答案(7)|浏览(146)

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

非常感谢大家的回答

vnjpjtjt

vnjpjtjt1#

我认为你应该先按数字排序,然后再按文字排序。

示范:

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

参见演示

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

参见演示

u4dcyp6a

u4dcyp6a2#

是否使用派生字段和别名?

SELECT name+0 AS fakename ...
ORDER BY fakename
brtdzjyr

brtdzjyr3#

试试这个:

$this->db->select('*')
         ->order_by('CAST(name AS DECIMAL(10,6)) ASC')
         ->get('table_name');
dhxwm5r4

dhxwm5r44#

用途

$this->db->order_by('fieldname + 0 ','',false,false);

这对我在Codeigniter版本3上起作用了

inn6fuwd

inn6fuwd5#

$this->db->select('*');

$this->db->order_by('sum(fieldname)', 'ASC');
ve7v8dk2

ve7v8dk26#

提取第一个字符串(按照@1000111的示例),并将其CASTDECIMAL,保留一个小数位:

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)。

ohtdti5x

ohtdti5x7#

$this->db->order_by('CAST(fieldname AS SIGNED) ASC');

相关问题