我的列表是一个无限的宇宙,作为示例,我想采用这样的表格:
+-------+------+ | group | name | +-------+------+ | 1 | A | | 1 | B | | 1 | C | | 1 | D | | 1 | E | | 1 | F | | 1 | G | | 1 | H | | 1 | I | | 2 | J | | 2 | L | | 2 | M | | 3 | N | | 4 | O | | 4 | P | | 4 | Q | | 4 | R | | 4 | S | | 5 | U | | 6 | V | +-------+------+
并运行一个查询,按以下顺序生成结果:
+-------+------+ | group | name | +-------+------+ | 1 | A | | 2 | J | | 3 | N | | 4 | O | | 5 | U | | 6 | V | | 1 | B | | 2 | L | | 4 | P | | 1 | C | | 2 | M | | 4 | Q | | 1 | D | | 4 | R | | 1 | E | | 4 | S | | 1 | F | | 1 | G | | 1 | H | | 1 | I | +-------+------+
最佳答案
select `group`, name from (
select
t.*,
@rn := if(`group` != @ng, 1, @rn + 1) as ng,
@ng := `group`
from t
, (select @rn:=0, @ng:=null) v
order by `group`, name
) sq
order by ng, `group`, name
- 看到它在 中实时运行 sqlfiddle
稍微解释一下......
, (select @rn:=0, @ng:=null) v
这一行只是一种动态初始化变量的奇特方法。这与省略此行但具有 SET @rn := 0; 相同在
。SELECT
之前设置 @ng := NULL;
那么子查询中的ORDER BY
就非常重要了。在关系数据库中,除非您指定,否则没有顺序。
这里
@rn := if(`group` != @ng, 1, @rn + 1) as ng,
@ng := `group`
第一行是一个简单的检查,检查当前行中group
的值是否与@ng
的值不同。如果是,则将 1
分配给 @rn
,如果不是,则增加 @rn
。
SELECT
子句中列的顺序非常重要。 MySQL 一一处理。在第二行中,我们将当前行的group
值分配给@ng
。当查询处理表的下一行时,在上面两行的第一行中,@ng
将保存上一行的值。
外部选择只是装饰性的,用于隐藏不必要的列。如果还有什么不清楚的地方,请随时询问。哦,还有here您可以阅读有关 MySQL 中用户定义变量的更多信息。
但请注意,需要变量只是异常(exception)。它们通常会导致全表扫描。无论您想通过 select 语句中的变量实现什么目的,通常最好在应用程序级别而不是数据库级别完成。
关于mysql - MySQL 有没有办法对变量 Universe 中的特定字段执行 “round robin” ORDER BY ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22407233/