mysql - MySQL 有没有办法对变量 Universe 中的特定字段执行 “round robin” ORDER BY ?

标签 mysql sql-order-by round-robin

我的列表是一个无限的宇宙,作为示例,我想采用这样的表格:

+-------+------+
| 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

稍微解释一下......

  , (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/

相关文章:

sqlite - 按特定/自定义顺序查询 Sqlite 数据库?

dns - Consul dns 循环和 ping

java - JVM DNS 缓存和 DNS 循环

PHP/MySQL 嵌套获取?

MySql 循环每一行进行计算

MySQL 查询中的 PHP 日期

mysql - ERROR : (gcloud. sql.instances.describe) HTTPError 404 : The Cloud SQL instance does not exist, 但它确实存在?

postgresql - 多列索引和 ORDER BY

Android MediaStore 查询 MediaStore.MediaColumns.TITLE column is null for some files

java - 如何实现轮询循环链表并统计元素的访问请求?