gpt4 book ai didi

MySQL ORDER BY Column = value AND distinct?

转载 作者:行者123 更新时间:2023-11-29 00:12:27 26 4
gpt4 key购买 nike

我现在头发都白了......

我有一张这样的 table 。

ID - Place - Person
1 - London - Anna
2 - Stockholm - Johan
3 - Gothenburg - Anna
4 - London - Nils

我想得到包含所有不同人的结果,但我想选择按哪个地点订购。

例如。我想获得一份 list ,其中它们是按 LONDON 订购的,其余的将紧随其后,但在 PERSON 上是不同的。

Output like this:
ID - Place - Person
1 - London - Anna
4 - London - Nils
2 - Stockholm - Johan

试过这个:

SELECT ID, Person
FROM users
ORDER BY FIELD(Place,'London'), Person ASC "

但它给了我:

ID - Place - Person
1 - London - Anna
4 - London - Nils
3 - Gothenburg - Anna
2 - Stockholm - Johan

而且我真的不希望 Anna 或任何人出现在结果中不止一次。

最佳答案

这是获取指定输出的一种方法,但它使用了无法保证的 MySQL 特定行为:

SELECT q.ID
, q.Place
, q.Person
FROM ( SELECT IF(p.Person<=>@prev_person,0,1) AS r
, @prev_person := p.Person AS person
, p.Place
, p.ID
FROM users p
CROSS
JOIN (SELECT @prev_person := NULL) i
ORDER BY p.Person, !(p.Place<=>'London'), p.ID
) q
WHERE q.r = 1
ORDER BY !(q.Place<=>'London'), q.Person

此查询使用内联 View 按 Person 以特定顺序返回所有行,以便所有“Anna”行都在一起,然后是所有“Johan”行,等等。行集每个人都先按 Place='London' 排序,然后按 ID 排序。

“技巧”是使用 MySQL 用户变量将当前行的值与前一行的值进行比较。在此示例中,我们检查当前行中的“人”是否与上一行中的“人”相同。基于该检查,如果这是我们正在为一个人处理的“第一”行,我们将返回 1,否则我们将返回 0。

最外层的查询处理内联 View 中的行,并排除每个人的“第一”行(我们从内联 View 返回的 0 或 1)以外的所有行。

(这不是获取结果集的唯一方法。但这是模拟其他 RDBMS 中可用的分析函数的一种方法。)


为了比较,在 MySQL 以外的数据库 中,我们可以像这样使用 SQL:

SELECT ROW_NUMBER() OVER (PARTITION BY t.Person ORDER BY 
CASE WHEN t.Place='London' THEN 0 ELSE 1 END, t.ID) AS rn
, t.ID
, t.Place
, t.Person
FROM users t
WHERE rn=1
ORDER BY CASE WHEN t.Place='London' THEN 0 ELSE 1 END, t.Person

跟进

在回答的开头,我提到了无法保证的 MySQL 行为。我指的是在 SQL 语句中使用 MySQL 用户定义变量。

MySQL 5.5 引用手册摘录http://dev.mysql.com/doc/refman/5.5/en/user-variables.html

“作为一般规则,除了在 SET 语句中,您永远不应该为用户变量赋值并在同一语句中读取该值。”

“对于其他语句,例如 SELECT,您可能会得到您期望的结果,但这并不能保证。”

“涉及用户变量的表达式的求值顺序未定义。”

关于MySQL ORDER BY Column = value AND distinct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24388907/

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