Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从MySQL返回结果时的数字顺序_Php_Mysql_Codeigniter_Natural Sort - Fatal编程技术网

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排序

如果你不能做到这一点,你有两种可能:

  • 用PHP对主题进行排序。只要你没有太多的话题,这是很容易和快速的
  • 填充主题编号,例如主题00001等等;专题00002-Foo;等等。这些都是按照你想要的顺序排序的。如果不想显示前导零,很容易去掉:
    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)