Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果上一个选择为空,则选择MySql_Php_Mysql - Fatal编程技术网

Php 如果上一个选择为空,则选择MySql

Php 如果上一个选择为空,则选择MySql,php,mysql,Php,Mysql,我有两张桌子。 包含我能听的所有歌曲的歌曲表。 我将播放日期和时间的歌曲放在存档表中 我要做的是让数据库给我一首歌: 1从不播放不在表存档中的内容 。。。。如果不可能 2存档,但至少在24小时前播放过 。。。。如果不可能 3是否在存档中,但歌曲的作者至少在3小时前播放过 4最后,如果没有结果,我希望数据库从歌曲表返回一首随机歌曲 我在这个世界上尝试过,但没有成功从何处删除存档条件并将其用作联接条件。老实说,即使您可以使用联合将其作为单个查询编写,我也不会这样做。原因很简单:您想要选择一个符合上述

我有两张桌子。 包含我能听的所有歌曲的歌曲表。 我将播放日期和时间的歌曲放在存档表中

我要做的是让数据库给我一首歌:

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
    )