Php 如果上一个选择为空,则选择MySql
我有两张桌子。 包含我能听的所有歌曲的歌曲表。 我将播放日期和时间的歌曲放在存档表中 我要做的是让数据库给我一首歌: 1从不播放不在表存档中的内容 。。。。如果不可能 2存档,但至少在24小时前播放过 。。。。如果不可能 3是否在存档中,但歌曲的作者至少在3小时前播放过 4最后,如果没有结果,我希望数据库从歌曲表返回一首随机歌曲Php 如果上一个选择为空,则选择MySql,php,mysql,Php,Mysql,我有两张桌子。 包含我能听的所有歌曲的歌曲表。 我将播放日期和时间的歌曲放在存档表中 我要做的是让数据库给我一首歌: 1从不播放不在表存档中的内容 。。。。如果不可能 2存档,但至少在24小时前播放过 。。。。如果不可能 3是否在存档中,但歌曲的作者至少在3小时前播放过 4最后,如果没有结果,我希望数据库从歌曲表返回一首随机歌曲 我在这个世界上尝试过,但没有成功从何处删除存档条件并将其用作联接条件。老实说,即使您可以使用联合将其作为单个查询编写,我也不会这样做。原因很简单:您想要选择一个符合上述
我在这个世界上尝试过,但没有成功从何处删除存档条件并将其用作联接条件。老实说,即使您可以使用联合将其作为单个查询编写,我也不会这样做。原因很简单:您想要选择一个符合上述任何条件的随机歌曲记录 我宁愿发出一个查询,尝试获取一首以前从未播放过的歌曲,在应用程序中处理结果,如果没有返回任何记录,则继续执行下一个查询
如果您坚持在一个查询中组合这4个条件,即使这样,我也会编写4个查询并将它们与union组合成一个查询。此外,我不会使用order by rand,因为它的伸缩性不好。我将执行查询以确定与每个条件匹配的记录数,确定0和count-1之间的随机数,并使用limit子句选择随机记录。如果计数返回0,则可以从联合中忽略该查询。这不会提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论-您可以随时在自己的帖子上发表评论,一旦您有足够的评论,您就可以发表评论了。感谢Logan的建议,对此表示歉意。谢谢@Shadow,您的回答很有用!
(
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
)