mysql中奇怪的orderby:order在字段a上加上字段b的重复状态

nafvub8i  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(273)

我需要一个非常奇怪的订单。假设我有一张这样的table:

pkey   id2
1      8
2      3
3      12
4      8
5      7
6      8
7      3
8      1

我需要按以下顺序选择:follow pkey,除非id2有重复项。然后先做复制品。
因此,order by应该给出以下结果:

pkey   id2
1      8
4      8
6      8
2      3
7      3
3      12
5      7
8      1

我不知道从哪里开始。分组依据?子查询?有什么想法吗?或者我应该去吗?我更喜欢用mysql。

ux6nzvsh

ux6nzvsh1#

乌伊尔多在评论中给出了答案。我仍然想给他学分,但人们会感到困惑,所以我张贴这个答案无论如何,但我邀请Uuerdo张贴的答案,这样我就可以标记他的答案是正确的。
不管怎样,解决方案是:

SELECT a.* 
FROM table a 
     JOIN 
     (SELECT id2, MIN(pkey) as minId FROM table b GROUP BY id2) b 
     USING (id2) 
ORDER BY minId, pkey, id
kninwzqo

kninwzqo2#

在我简洁的暗示之后,罗默想出了这个解决方案:

SELECT a.* 
FROM table a 
     JOIN 
     (SELECT id2, MIN(pkey) as minId FROM table b GROUP BY id2) b 
     USING (id2) 
ORDER BY minId, pkey, id

它使用聚合子查询来查找每个id2的第一个pkey,并使用外部查询中的那些pkey值来控制排序。

thtygnil

thtygnil3#

我会将查询加入到一个计算重复次数的聚合查询中 id2 每个人 pkey 有。自从多次 pkey 可以有相同数量的关联 id2 s、 我会把最小的 pkey 只是为了确保所有的行都是相同的 pkey 一起:

SELECT   a.pkey, a.id2
FROM     mytable a
JOIN     (SELECT   id2, COUNT(*) AS cnt, MIN(pkey) AS mpkey
          FROM     mytable
          GROUP BY id2) ON a.id2 = b.id2
ORDER BY cnt DESC, mpkey ASC, a.pkey ASC

相关问题