繁体   English   中英

MySql Select 如果之前的 Select 为空

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM