在mysql case select中选择要输出的2个不明确字段中的哪一个

7ajki6be  于 2023-01-04  发布在  Mysql
关注(0)|答案(1)|浏览(131)

我有一个名为tracks的表,它看起来像这样:

persistent_id       artist  name    play_count
C660FF302599636B    artist1 name1   14
0BDDB14AE2CC4675    artist2 name2   78
000ABA9AB1DCD725    artist3 name3   10
00361E574E776781    artist4 name4   10

我正在进行一个选择,希望对C660FF302599636B0BDDB14AE2CC4675play_count求和,但在其他情况下显示其他信息,如C660FF302599636Bartistname,方法如下:

SELECT artist, name, sum(play_count), 
    case when tracks.Persistent_ID IN ('C660FF302599636B', '0BDDB14AE2CC4675')
        THEN 'C660FF302599636B'
        ELSE tracks.Persistent_ID 
    END Persistent_ID
FROM tracks
GROUP BY case when tracks.Persistent_ID IN ('C660FF302599636B', '0BDDB14AE2CC4675')
            THEN 'C660FF302599636B'
            ELSE tracks.Persistent_ID 
        END
ORDER BY sum(play_count) DESC

我得到了这个结果:

artist2 name2   92  C660FF302599636B
artist3 name3   10  000ABA9AB1DCD725
artist4 name4   10  00361E574E776781

而我想要这个结果:

artist1 name1   92  C660FF302599636B
artist3 name3   10  000ABA9AB1DCD725
artist4 name4   10  00361E574E776781

我知道name s和artist s都会被选中,因为如果我执行group_concat,我会看到它(substring_index(group_concat(artist), ',', -1)),但它是第一个还是第二个子字符串对于每行来说似乎是随机的。

6uxekuva

6uxekuva1#

使用自联接选择要返回的artistname的值。

SELECT 
    MAX(IF(t1.Persistent_ID = 'C660FF302599636B', t1.artist, t2.artist)) AS artist, 
    MAX(IF(t1.Persistent_ID = 'C660FF302599636B', t1.name, t2.name)) AS name, 
    sum(t1.play_count) AS total_play_count, 
    case when t1.Persistent_ID IN ('C660FF302599636B', '0BDDB14AE2CC4675')
        THEN 'C660FF302599636B'
        ELSE t1.Persistent_ID 
    END Persistent_ID
FROM tracks AS t1
JOIN tracks AS t2 ON t1.Persistent_ID = t2.Persistent_ID
GROUP BY Persistent_ID
ORDER BY total_play_count DESC

DEMO
我假设Persistent_ID是表中的唯一列,因此连接是1对1的,而不是叉积。
顺便说一句,没有必要在GROUP BY中重复CASE表达式,因为您在SELECT列表中为同一表达式分配了别名,所以可以引用该别名。

相关问题