2015-11-02 49 views
-1

我有两个表。 歌曲表包含我可以听的所有歌曲。 存档表我把播放的歌曲与日期和时间。MySql如果前面的选择是空的选择

我会做什么是查询数据库给我一首歌:

1)不要玩过(没有出现在表归档)

....如果无法

2)存在于档案但

之前已被播放至少24小时....如果不可能

3)是否在此存档但阿尔季这首歌的ST

4)最后,之前已经玩过至少3个小时,如果没有结果,我想从数据库中的宋表

(
     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 
    ) 

我试图返回一个随机歌曲在这个世界但不工作

回答

0

从哪里删除归档条件并将其用作连接条件。

+0

这不会提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 –

+0

谢谢Logan的建议,并为此感到抱歉。 –

0

说实话,即使你可以把它写成使用联合的单个查询,我也不会那么做。原因很简单:你想选择一个随机的歌曲(唱片)匹配任何上述标准。

我宁愿发出一个查询,试图获取以前从未播放过的歌曲,在您的应用程序中处理结果,并且如果没有记录被返回,则继续进行下一个查询。

如果您坚持在单个查询中组合4个条件,即使这样我会写4个查询并将它们与union结合为一个查询。另外,我不会使用rand()的顺序,因为它不能很好地扩展。我会执行查询来确定匹配每个条件的记录的数量(计数),确定一个介于0和count-1之间的随机数,并使用limit子句来选择一个随机记录。如果计数返回0,那么可以从联合中省略该查询。

+0

谢谢@Shadow,你的回答很有用! – Jonny