[英]MySql Select if the previous Select is Empty
我有两张桌子。 包含我可以听的所有歌曲的歌曲表。 存档表,我将播放的歌曲与日期和时间放在一起。
我会做的是让数据库给我一首歌:
1) 从未玩过(不存在于表存档中)
.... 如果不可能
2) 出现在档案中,但至少在 24 小时前播放过
.... 如果不可能
3) 这是否在档案中,但歌曲的艺术家至少在 3 小时前播放过
4)最后,如果没有结果,我希望数据库从Song 表中随机返回一首歌曲
(
SELECT song.*
FROM
song AS song
LEFT JOIN
( SELECT song_artist
FROM archive
WHERE customer_id=50
AND genre=32
AND channel=44
AND archive_date < DATE_SUB(NOW(), INTERVAL 3 HOUR)
)
AS archive_a
ON song.song_artist = archive_a.song_artist
LEFT JOIN
(SELECT song_id
FROM archive
WHERE customer_id=50
AND genre=32
AND channel=44
AND archive_date < DATE_SUB(NOW(), INTERVAL 24 HOUR)
)
AS archive_b
ON song.song_id = archive_b.song_id
LEFT JOIN
( SELECT a.song_id FROM song a
LEFT JOIN archive b
ON a.song_id = b.song_id
WHERE NOT EXISTS (
SELECT null
FROM archive c
WHERE customer_id=50
AND genre=32
AND channel=44
AND c.song_id = a.song_id
)
)
AS song_c
ON song.song_id = song_c.song_id
WHERE FIND_IN_SET('32', genre) <> 0
AND archive_a.song_artist Is Null
AND archive_b.song_id Is Null
AND song_c.song_id Is Null
GROUP BY song_artist ORDER BY RAND() LIMIT 1
)
UNION
(
SELECT song.*
FROM
song AS song
WHERE FIND_IN_SET('32', genre) <> 0
GROUP BY song_artist ORDER BY RAND() LIMIT 1
)
我在这个世界上尝试过但没有工作
从 where 删除存档条件并将其用作连接条件。
老实说,即使您可以使用联合将其编写为单个查询,我也不会那样做。 原因很简单:您要选择符合上述任何条件的随机歌曲(唱片)。
我宁愿发出一个查询,尝试获取以前从未播放过的歌曲,在您的应用程序中处理结果,如果没有返回记录,则继续下一个查询。
如果您坚持在单个查询中组合 4 个条件,即使那样,我也会编写 4 个查询并将它们与 union 合并为一个。 此外,我不会使用 rand() 的顺序,因为它不能很好地扩展。 我将执行查询以确定匹配每个条件的记录数(计数),确定 0 和 count-1 之间的随机数,并使用 limit 子句选择随机记录。 如果计数返回 0,则您可以从联合中省略该查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.