2015-11-02 19 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