我在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');
非常感谢大家的回答
7条答案
按热度按时间vnjpjtjt1#
我认为你应该先按数字排序,然后再按文字排序。
示范:
输出:
下面是完整的查询:
参见演示
也可以尝试将数字字符串转换为十进制类型。
参见演示
u4dcyp6a2#
是否使用派生字段和别名?
brtdzjyr3#
试试这个:
dhxwm5r44#
用途
这对我在Codeigniter版本3上起作用了
inn6fuwd5#
ve7v8dk26#
提取第一个字符串(按照@1000111的示例),并将其
CAST
为DECIMAL
,保留一个小数位:在CodeIgniter中,它看起来像这样:
如果您的标题有更多的小数位数,那么请更改DECIMAL的定义。例如,如果您有1.15和1.17,那么您需要两位小数位数,那么您可以将其更改为DECIMAL(9,2)。
ohtdti5x7#