gpt4 book ai didi

mysql - MySQL 中有没有一种方法可以在变量 universe 中的特定字段上执行 “round robin” ORDER BY?

转载 作者:行者123 更新时间:2023-11-29 01:41:02 24 4
gpt4 key购买 nike

我的列表是一个无限大的宇宙,举个例子,我想拿一张这样的表:

+-------+------+| 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; 相同SET @ng := NULL;SELECT 之前。

那么子查询中的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com