我在db中的表中有以下类型的标题:
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?
答案 0 :(得分:5)
这是您的数据库设计的问题。主题编号应存储为整数。如果您无法更改设计,请尝试使用此查询:
SELECT title
FROM table1
ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(title, ' ', 2), ' ', -1)
AS UNSIGNED);
结果:
'topic 1 foo' 'topic 2 bar' 'topic 10 baz'
测试数据:
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');
答案 1 :(得分:2)
您无法在SQL中执行此操作。 ORDER BY可以按字母顺序排序,但总是在主题1之后放置主题10.我认为您需要创建一个包含条目实际顺序的新列。
答案 2 :(得分:2)
我认为威廉正在寻找的是一种自然的方式。我不相信这是在mysql中实现的。
如果您的数据已知采用此格式,则可能更容易使用substr并可能按顺序强制转换。
例如:
select title from table order by cast(substr(title, 7) as signed integer);
然而,这是一个糟糕的解决方案,并且对其他类型的数据不灵活。例如,新行“Z Topics 1”将打破它,并且到目前为止发布的任何其他解决方案。我认为您需要使用支持自然排序的语言进行外部排序,或者添加特定于排序的新列(例如创建日期)
答案 3 :(得分:1)
文本以这种方式排序。由于char“1”小于char“2”,因此“10”在“2”之前。这就是为什么你看到这个顺序的主题,而不是数字顺序。
我建议你做的是在表格中添加一个topic_number INTEGER字段,然后按topic_number排序。
如果你不能这样做,你有两种可能:
preg_replace('/Topic 0+/', 'Topic ', $text);
答案 4 :(得分:0)
查找ORDER BY
子句。您可以按...ORDER BY TOPIC ASC
字段按升序排序TOPIC
(DESC
会降序排列)。由于看起来TOPIC
是一个字母字段,您可能会在“主题2”之前看到“主题10”。我不确定MySQL是否具有自然排序功能,因此您可能希望向表中添加排序值列。或者,按主题的ID字段排序(但如果主题未按顺序添加到数据库中,则无效)。
答案 5 :(得分:0)
什么是FrustratedWithFormsDes所说的 - 听起来好像主题id不是数字而是字符串
答案 6 :(得分:0)
如果您提供的那些记录都在一个字段中,则ORDER BY正在执行它所做的事情。它按字母顺序排序,按字母顺序排序10在2之前。
最好的办法是在表格中添加一个“topic_id”字段,该字段具有数字格式的主题ID(确保该字段是数字数据类型,如int)。
或者,如果这绝对不是一个选项,并且您知道Title的格式将始终相同,您可以编写用户定义的函数,然后通过该函数执行订单(但这非常激烈。如果可能的话,去新的野外路线。
http://dev.mysql.com/doc/refman/5.0/en/adding-functions.html
答案 7 :(得分:0)
我建议您使用值topic_name
- “主题”+数字的字段'Topic 1','Topic 2', ... Topic N
。要按此数字排序,您需要拆分字段值
OREDER BY CAST(SUBSTRING(topic_name,7) AS UNSIGNED)