我有一个生成广播电台播放列表的网络服务,我正在努力确保播放列表永远不会有来自同一艺术家的曲目超过n次。
因此,例如(除非是 Mandatory Metallica --haha),那么任何艺术家都不应该主宰任何 8 小时的节目片段。
今天我们使用与此类似的查询,它从现有的非常大的播放列表中生成更小的随机播放列表:
SELECT FilePath FROM vwPlaylistTracks
WHERE Owner='{0}' COLLATE NOCASE AND
Playlist='{1}' COLLATE NOCASE
ORDER BY RANDOM()
LIMIT {2};
如果同一艺术家连续出现或超过所需限制,则必须有人手动查看播放列表并进行一些手动编辑。
假设制作人希望确保在此查询中生成的播放列表的跨度中没有艺术家出现超过两次(并假设在 vwPlaylistTracks 视图中有一个艺术家字段;有)是 GROUP BY 完成此任务的正确方法吗?
我一直在搞乱试图完成此操作的视图,但此查询始终只返回每个艺术家的 1 首曲目。
SELECT
a.Name as 'Artist',
f.parentPath || '\' || f.fileName as 'FilePath',
p.name as 'Playlist',
u.username as 'Owner'
FROM mp3_file f,
mp3_track t,
mp3_artist a,
mp3_playlist_track pt,
mp3_playlist p,
mp3_user u
WHERE f.file_id = t.track_id
AND t.artist_id = a.artist_id
AND t.track_id = pt.track_id
AND pt.playlist_id = p.playlist_id
AND p.user_id = u.user_id
--AND p.Name = 'Alternative Rock'
GROUP BY a.Name
--HAVING Count(a.Name) < 3
--ORDER BY RANDOM()
--LIMIT 50;