MySQL:返回结果及其顺序

Posted

技术标签:

【中文标题】MySQL:返回结果及其顺序【英文标题】:MySQL: return result with its order 【发布时间】:2016-03-04 18:42:23 【问题描述】:

有没有办法按顺序返回结果?

示例:对quiz 表运行以下查询:

select q.category_id, q.quiz_id, concat('Quiz ',q.name) name
from quiz q
where q.category_id = 11
order by q.category_id ASC
limit 2
offset 2;

quiz(结构):

+-------------+---------+-------+
| category_id | quiz_id | name  |
+-------------+---------+-------+
| 10          | 10      | math  |
| 11          | 10      | sport |  => Quiz Sport 1
| 11          | 11      | sport |  => Quiz Sport 2
| 12          | 10      | Geo.  |
| 11          | 15      | sport |  => Quiz Sport 3
| 11          | 12      | sport |  => Quiz Sport 4
| 10          | 17      | math  |
| 11          | 20      | sport |  => Quiz Sport 5
| 11          | 22      | sport |  => Quiz Sport 6
| 10          | 19      | math  |
+-------------+---------+-------+

返回:

+-------------+---------+------------+
| category_id | quiz_id | name       |
+-------------+---------+------------+
| 11          | 15      | Quiz sport |
| 11          | 12      | Quiz sport |
+-------------+---------+------------+

http://sqlfiddle.com/#!9/110752/2

有没有办法以测验编号顺序返回结果,如下所示:

+-------------+---------+--------------+
| category_id | quiz_id | name         |
+-------------+---------+--------------+
| 11          | 15      | Quiz sport 3 |
| 11          | 12      | Quiz sport 4 |
+-------------+---------+--------------+

【问题讨论】:

您需要有另一个字段order by 才能确定正确的顺序。 Sql 是无序存储的——因此除非您可以按其他字段排序,否则您将无法保证结果。 这在 mysql 以外的任何东西中都会很多容易,因为由于某种原因 MySql 没有窗口函数,即使它们已经成为 ansi 标准的一部分超过10年。使用窗口函数,这是一个简单的row_number() 调用,Postgresql、Oracle、Sql Server、DB2、sybase 以及我能想到的任何其他东西都支持它......但不是 mysql。 quiz 表上没有主键? Row Rank in a MySQL View的可能重复 【参考方案1】:

您需要建立一个行号来执行此操作。这样做意味着您需要 order by 的唯一字段以确保结果的顺序。您可以在 mysql 中使用user-defined variables 获取行号。这是quiz_id 重新排序的示例:

select * 
from (select q.category_id, q.quiz_id, @rn := @rn + 1, concat('Quiz ',q.name, @rn) name
    from quiz q, (select @rn := 0) t
    where q.category_id = 11
    order by q.category_id ASC, q.quiz_id) t
order by category_id ASC, quiz_id
limit 2
offset 2;
SQL Fiddle Demo

【讨论】:

【参考方案2】:

如果您有主键,则可以按主键排序

select q.category_id, q.quiz_id, concat('Quiz ',q.name) name
from quiz q
where q.category_id = 11
order by q.id, q.category_id ASC
limit 2
offset 2;

如果您不这样做,我建议您使用 something like this 添加主节点:

ALTER TABLE quiz ADD id INT PRIMARY KEY AUTO_INCREMENT;

如果由于某些原因不适用于您的工作,则 必须 成为 PRIMARY。您还可以使用上述语句添加rank 列,该列也是auto_increment

类似:

ALTER TABLE quiz ADD rank INT AUTO_INCREMENT;

(然后运行第一个查询。)

【讨论】:

【参考方案3】:

我发现了一个类似的问题,帮助我找到了您问题的答案: (感谢@OMG Ponies)LINK(请阅读他的回答以进一步了解该问题)

假设您要按顺序计算测验: 这是我的回答SQLFiddle link。

基本上,您是在计算条目数,并将其显示在列中。

【讨论】:

以上是关于MySQL:返回结果及其顺序的主要内容,如果未能解决你的问题,请参考以下文章

返回的 MySQL 查询结果是半随机的/不一致的顺序

python MySQL执行SQL查询结果返回字典

mysql-2种日志的操作顺序

MySQL大数据量分页查询方法及其优化

MySQL大数据量分页查询方法及其优化

MySQL View 代替子查询不返回相同的结果