我有一个名为tracks
的表,它看起来像这样:
persistent_id artist name play_count
C660FF302599636B artist1 name1 14
0BDDB14AE2CC4675 artist2 name2 78
000ABA9AB1DCD725 artist3 name3 10
00361E574E776781 artist4 name4 10
我正在进行一个选择,希望对C660FF302599636B
和0BDDB14AE2CC4675
的play_count
求和,但在其他情况下显示其他信息,如C660FF302599636B
的artist
和name
,方法如下:
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)
),但它是第一个还是第二个子字符串对于每行来说似乎是随机的。
1条答案
按热度按时间6uxekuva1#
使用自联接选择要返回的
artist
和name
的值。DEMO
我假设
Persistent_ID
是表中的唯一列,因此连接是1对1的,而不是叉积。顺便说一句,没有必要在
GROUP BY
中重复CASE
表达式,因为您在SELECT
列表中为同一表达式分配了别名,所以可以引用该别名。