Php 从MySQL返回结果时的数字顺序
我在数据库的表格中有以下类型的标题:Php 从MySQL返回结果时的数字顺序,php,mysql,codeigniter,natural-sort,Php,Mysql,Codeigniter,Natural Sort,我在数据库的表格中有以下类型的标题: Topic 1 blah blah Topic 2 blah blah Topic 3 blah blah ... Topic 10 blah blah Topic 11 blah blah etc... select查询将始终返回如下结果: Topic 1 blah Topic 10 blah blah Topic 11 blah …省略主题2、主题3等。。。直到所有的青少年都知道主题2等等 如何获得以下结果: Topic 1 Topic 2 T
Topic 1 blah blah
Topic 2 blah blah
Topic 3 blah blah
...
Topic 10 blah blah
Topic 11 blah blah
etc...
select查询将始终返回如下结果:
Topic 1 blah
Topic 10 blah blah
Topic 11 blah
…省略主题2、主题3等。。。直到所有的青少年都知道主题2等等
如何获得以下结果:
Topic 1
Topic 2
Topic 3
。。。。一直到主题9,然后才开始主题10?查找
ORDER BY
子句。您可以说,…ORDER BY TOPIC ASC
按TOPIC
字段按升序排序(而DESC
将按降序排序)。由于TOPIC
看起来像是一个字母字段,您可能会在“TOPIC 2”之前看到“TOPIC 10”。我不确定MySQL是否具有自然排序功能,因此您可能希望向表中添加一个排序值列。或者,按照主题的ID字段进行排序(尽管如果主题没有按顺序添加到数据库中,这将不会有帮助)。what fructedWithFormsDes所说的话-同样,听起来有点像主题ID不是数字,而是字符串,文本是按这种方式排序的。由于字符“1”小于字符“2”,所以“10”在“2”之前。这就是为什么您看到的主题是按此顺序排列的,而不是按数字顺序排列的
我建议您在表中添加一个topic\u number整数字段,并按topic\u number排序
如果你不能做到这一点,你有两种可能:
preg_replace('/Topic 0+/','Topic',$text)代码>
在SQL中不能这样做。ORDER BY可以按字母顺序排序,但这会将主题10放在主题1之后。我认为您需要创建一个新的列,列中包含条目的实际顺序。我认为William需要的是自然排序。我认为这还没有在mysql中实现 如果已知您的数据是这种格式,那么使用substr可能会更容易,并且可能会按顺序转换 例如:
select title from table order by cast(substr(title, 7) as signed integer);
然而,这是一个糟糕的解决方案,对于其他类型的数据来说并不灵活。例如,新行“ztopics1”将打破它和迄今为止发布的任何其他解决方案。我认为您需要使用支持自然排序的语言进行外部排序,或者添加一个特定于排序的新列(例如创建日期)这是数据库设计的问题。主题编号应存储为整数。如果无法更改设计,请尝试以下查询:
SELECT title
FROM table1
ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(title, ' ', 2), ' ', -1)
AS UNSIGNED);
结果:
如果您提供的记录都在一个字段中,那么ORDER BY正在执行它所做的操作。它按字母顺序排序,字母顺序10排在2之前 最好是将“topic_id”字段添加到具有数字格式的topic id的表中(确保该字段是数字数据类型,如int) 或者,如果这真的不是一个选项,并且您知道标题的格式总是相同的,那么您可以编写一个用户定义的函数,然后在该函数上执行您的命令(但这相当激烈。如果可能的话,请使用新的字段路径)
我建议您将字段
主题名称
的值设置为主题1'、“主题2'、。。。主题N
-“主题”+编号。要按此数字排序,需要拆分字段值
DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (title VARCHAR(100) NOT NULL);
INSERT INTO table1 (title) VALUES
('topic 1 foo'),
('topic 2 bar'),
('topic 10 baz');
正确-这是按文本排序时发生的情况。那么,您将如何解决这个问题?@OMG Ponies:我认为MySQL没有“自然”排序功能,因此可以添加一个特殊的排序值列。我们将ID字段更改为INTYes,但是如何使用MySQL功能呢?MySQL确实隐式地将字符串转换为整数……啊,好吧,我不知道“主题10”是字段的内容。我以为我们有一个文本字段,包含数字内容。“Topic”和“1”是在两个单独的字段中,还是在同一个字段中?这可能会有所不同。我想应该是在不同的领域。如果我们想要一个数据库,而不是一堆垃圾
orderby RIGHT(title,2)
,但风险是如果一个标题可以有一个三位数(或更多位数的数值)…我遇到了这个问题,因为数据位于Wordpress数据库的元表中(该表的meta_值行为LONGTEXT类型),所以CAST就是我要找的。谢谢+1:唯一的问题是从哪里开始子字符串orderbyright(title,2)
是另一种选择。我看到其他人也提出了相同的解决方案,但应该注意的是,只有当您的标题都以相同的开头时,这才有效。否则,这肯定是错误的解决方案。您真正需要的是自然排序,我认为mysql不支持这种方式——如果可能的话,我建议从外部进行排序。请参阅Mark Byers的示例,该示例根据标题和数字之间的空格启动子字符串。如果php是一个选项,我强烈建议使用natsort。
DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (title VARCHAR(100) NOT NULL);
INSERT INTO table1 (title) VALUES
('topic 1 foo'),
('topic 2 bar'),
('topic 10 baz');
OREDER BY CAST(SUBSTRING(topic_name,7) AS UNSIGNED)