我有一个带有Tunes表的音乐数据库。每个Tunes记录都包含ArtistID
和Rating
。
我想要做的是检索所有独特的ArtistID
字段(足够简单)加上一列,表明每个艺术家的曲调的某些评级值都是非零的。
我可以进行查询以返回0或1以确定是否有任何艺术家的曲调未被评级如下:
SELECT COUNT() FROM (
SELECT ID FROM Tune WHERE ArtistID=a AND Rating < 1 LIMIT 1
)
上述查询将返回“SomeUnrated”true或false(1或0)值。
并且..我可以进行查询以返回Tunes表中所有的唯一艺术家ID:
SELECT DISTINCT Artist.ID, Artist.Name
FROM Artist JOIN Tune ON Artist.ID=Tune.ArtistID
如何组合这两个查询,以便我得到一个值列表如下:
Artist.ID Artist.Name SomeUnrated
我正在使用 SQLite 。这是“相关”子查询的一个例子吗?
答案 0 :(得分:2)
如果您的未评级值是null
(正确的数据库设计会指定),那么您可以总结您的评分。一个数字+ null
= null
。所以你会得到你的错误。
Select
Artist.ID,
sum(rating) as SomeUnrated
from
Artist
join Tune on Artist.ID = Tune.ArtistID
group by
Artist.ID
这里是fiddle
我建议null
作为未评级的值,如果您仍想要零,则可以将null
合并为0
。
*我离开了名字,因为我忘了它在架构中,只需将它添加到选择和分组
编辑:
我相信这是基于评论的解决方案。
SELECT
Artist.ID,
Artist.Name,
SUM(Tune.Rating) AS SomeUnrated,
COUNT()
FROM
Artist
JOIN Tune ON Artist.ID = Tune.ArtistID
GROUP BY
Artist.ID
答案 1 :(得分:2)
作为最终查询的第一步,您可以将DISTINCT替换为GROUP BY:
SELECT
Artist.ID,
Artist.Name
FROM Artist
JOIN Tune ON Artist.ID = Tune.ArtistID
GROUP BY Artist.ID, Artist.Name;
结果与DISTINCT相同,但现在您可以将其他信息合并到查询中。您不需要将它作为子查询,但 需要条件才能使用它,所以......
SELECT
Artist.ID,
Artist.Name,
COUNT(DISTINCT CASE WHEN Rating < 1 THEN 1 END) AS SomeUnrated
FROM Artist
JOIN Tune ON Artist.ID = Tune.ArtistID
GROUP BY Artist.ID, Artist.Name;
或者,您可以使用MAX()
计算相同的结果:
SELECT
Artist.ID,
Artist.Name,
MAX(CASE WHEN Rating < 1 THEN 1 ELSE 0 END) AS SomeUnrated
FROM Artist
JOIN Tune ON Artist.ID = Tune.ArtistID
GROUP BY Artist.ID, Artist.Name;