2013-07-24 24 views
1

我遇到了MySQL查詢問題(我是一個新手,所以對我來說很容易!)。我有一個帶有電視節目的網站,並希望根據兩種不同的操作(用於自定義時間表)選擇兩個日期之間播出的節目(沒有問題)。基本上,如果用戶正在跟隨(uses_follow_shows)或觀看節目(user_watched),我想要顯示該節目,所以我認爲我會在下面有類似的內容,但這不起作用。它工作正常,除了我的結果有一方面的查詢結果和另一方的結果。結合兩個查詢OR和LEFT加入 - MySQL

即:

name     a1 name   a 
    Mistresses (US)  2 Wilfred (US) 2 
    Mistresses (US)  2 Dexter   2 

這是我的查詢:

我怎樣才能使它所以我所有的名字都在同一列?

 SELECT * FROM (
     SELECT shows.name, users_follow_shows.user_id a1 
     FROM show_episode_airdate join 
      show_episode 
      on show_episode.episode_id = show_episode_airdate.episode_id join 
      shows 
      on shows.imdb_id = show_episode.imdb_id_show join 
      show_network 
      on show_network.show_id = shows.id join 
      network 
      on show_network.network_id = network.network_id join 
      users_follow_shows 
      on shows.id = users_follow_shows.show_id 

     WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27' and 
      users_follow_shows.user_id = 2 

     ORDER by network.network_id ASC) a1 

     JOIN (
     SELECT shows.name, user_watched.user_id a 
     FROM show_episode_airdate join 
      show_episode 
      on show_episode.episode_id = show_episode_airdate.episode_id join 
      shows 
      on shows.imdb_id = show_episode.imdb_id_show join 
      show_network 
      on show_network.show_id = shows.id join 
      network 
      on show_network.network_id = network.network_id join 
      user_watched 
      on shows.id = user_watched.show_id 

     WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27' and 
      user_watched.user_id = 2 

     ORDER by network.network_id ASC) a 

     ON a = a1 

任何幫助表示讚賞。謝謝。

+0

在您的查詢中,a和a1是表格。你不能加入table = table,但必須指定要加入的字段:ON a.field1 = a1.fieldN – makciook

回答

0

未經測試,但我會簡化你這樣的查詢:

SELECT 
    shows.name, 
    users_follow_shows.user_id a1 
FROM show_episode_airdate 
    JOIN show_episode on show_episode.episode_id = show_episode_airdate.episode_id 
    JOIN shows on shows.imdb_id = show_episode.imdb_id_show 
    JOIN show_network on show_network.show_id = shows.id 
    JOIN network on show_network.network_id = network.network_id 
    LEFT JOIN users_follow_shows on shows.id = users_follow_shows.show_id 
    LEFT JOIN user_watched on shows.id = user_watched.show_id 
WHERE show_episode_airdate.airdate BETWEEN '2013-07-20' AND '2013-07-27' 
    AND (users_follow_shows.user_id = 2 OR user_watched.user_id = 2) 
+0

我得到的user_id不是2在1列...我不明白... – Callombert

1

你可以像這樣子查詢開始:

SELECT DISTINCT user_id, show_id 
    FROM (
    SELECT user_id 
      show_id 
     FROM user_watched 
    UNION 
    SELECT user_id 
      show_id 
     FROM user_follows_show 
) 

這會給你一個獨特的用戶和節目的虛表,以滿足你的兩個將它們包含在列表中的標準。然後,您可以加入到你的查詢的其餘部分,像這樣:

SELECT whatever 
    FROM whatever 
    JOIN (
    SELECT DISTINCT user_id, show_id 
     FROM (
     SELECT user_id 
       show_id 
      FROM user_watched 
     UNION 
     SELECT user_id 
       show_id 
      FROM user_follows_show 
    ) USER_INTERESTED ON USER_INTERESTED.show_id = shows.id 
    WHERE whatever 

的技巧是使用結構化查詢語言結構部分獲得用戶之間的虛擬關係/顯示您需要的請求你的查詢。