2015-10-04 26 views
1

我正在使用下面的mysql來查看用戶訂閱。我需要得到所有用戶,並在一所中顯示,如果他們有一個活躍的認購或不mysql完全加入不能正常工作

這是我曾嘗試:

SELECT `general`.`exchange`.`email`,substring_index(`general`.`exchange`.`name`, " ", 1) as name, `courses`.`courseSubscriptions`.`expiryTimestamp` 
FROM `general`.`exchange` 
LEFT JOIN `courses`.`courseSubscriptions` 
ON `courses`.`courseSubscriptions`.`memberID` = `general`.`exchange`.`id` 
WHERE (`courses`.`courseSubscriptions`.memberID = `general`.`exchange`.`id`) 
AND (`courses`.`courseSubscriptions`.expiryTimestamp > 1443975741) 

的問題是,它僅返回誰擁有用戶訂閱。我需要它返回所有用戶,並顯示在有訂閱或不訂閱的專欄

我該怎麼做?

+0

可以添加示例數據的幾行對每個表,你希望得到的結果 – Phil

+0

你的加入究竟是不是一個'完全加入'(MySQL不支持)。這是一個「左連接」。 –

+0

也不要使用雙引號作爲字符串參數,總是使用單引號RDBM可能會錯過解釋。 @GordonLinoff的答案顯示它已修復! –

回答

1

您的where條款將left join轉換爲inner join。另外,表的別名將使查詢更容易編寫和閱讀:

SELECT e.`email`, substring_index(e.`name`, ' ', 1) as name, cs.`expiryTimestamp` 
FROM `general`.`exchange` e LEFT JOIN 
    `courses`.`courseSubscriptions` cs 
    ON cs.`memberID` = e.`id` AND (cs.expiryTimestamp > 1443975741) ; 

LEFT JOIN問題的解決方案是在表移動的條件進入ON條款。另外,您不需要重複加入條件。

如果你想有一個標誌,你可以添加:

SELECT e.`email`, substring_index(e.`name`, ' ', 1) as name, cs.`expiryTimestamp`, 
     (cs.`expiryTimestamp` is not null) as isActiveFlag 
FROM `general`.`exchange` e LEFT JOIN 
    `courses`.`courseSubscriptions` cs 
    ON cs.`memberID` = e.`id` AND (cs.expiryTimestamp > 1443975741) ; 
+0

都有一排我在'on子句'中收到未知列'g.exchange.id' – Jake

+0

@Jake。 。 。這是一個錯字。兩個表別名是'e'和'cs',並且適用於所有列名稱。 –

0

你重複where子句中的join條件。由於null永遠不會在平等檢查中返回true,所以這將有效地刪除沒有任何課程的用戶,並將外部聯接變爲內部聯接。同樣,在球場上的時間條件也應該被移動到連接語句:

SELECT  `general`.`exchange`.`email`, 
      SUBSTRING_INDEX(`general`.`exchange`.`name`, " ", 1) AS name, 
      `courses`.`courseSubscriptions`.`expiryTimestamp` 
FROM  `general`.`exchange` 
LEFT JOIN `courses`.`courseSubscriptions` ON 
      `courses`.`courseSubscriptions`.`memberID` = 
      `general`.`exchange`.`id` AND 
      `courses`.`courseSubscriptions`.expiryTimestamp > 1443975741 
+0

我試過這個,但它只返回存在於'courses'.courseSubscriptions'表中的行,並不是每個用戶都在該表中有一行。 – Jake

+0

@Jake忘記了將expiryTimestamp條件也移到'join'子句中。 Mea culpa。編輯並修復。 – Mureinik