2014-08-29 20 views
2

大家早上好。OUTER JOIN MySQL中的三個不同表格的問題

背景
我在這樣的情況:我有三個表這種方式構造(省略爲簡潔IDS)

SUBS:代碼,MAG,開始,結束
USERS:代碼,電子郵件
問題:問題,雜誌,出版物

「subs」包含訂閱雜誌:CODE是公司代碼,MAG是mag的標識符,START和END是訂閱有效的日期。
「用戶」包含的公司代碼(1/N)
「問題」相關的電子郵件是每本雜誌的每個問題的列表,其出版日期

樣本數據

SUBS: C0003072, 01ARS, 2014-01-01, 2014-03-01 
ISSUES: 01ARS14000387, 01ARS, 2014-01-01 
     01ARS14000388, 01ARS, 2014-02-01 
     01ARS14000389, 01ARS, 2014-03-01 
     01ARS14000390, 01ARS, 2014-04-01 
USERS: C0003072, [email protected] 
     C0003072, [email protected] 

我想要達到的目標
所有擁有他們有權查看的雜誌的用戶列表。如果他們的子刊物中沒有雜誌,我只需要用戶。因此,對於例如之前:

[email protected], 01ARS14000387 
[email protected], 01ARS14000388 
[email protected], 01ARS14000389 
[email protected], 01ARS14000387 
[email protected], 01ARS14000388 
[email protected], 01ARS14000389 

WHERE我堅持 我已經寫了兩個不同的查詢:

SELECT subs.code, issues.issue 
FROM subs 
LEFT JOIN issues 
ON subs.mag=issues.mag 
WHERE issues.pubdate<=subs.end 
AND issues.pubdate>=subs.start 

這正確給我的所有雜誌公司應該看到列表
以下步驟是我遇到問題的地方。我嘗試將單個查詢放在一起以獲得上述所需的結果,但我一直得到一個我不明白的語法錯誤。這是我的查詢:

SELECT subs.code, issues.issue, users.email 
FROM subs 
LEFT JOIN issues 
ON subs.mag=issues.mag 
OUTER JOIN users 
ON subs.code=users.code 
WHERE issues.pubdate<=subs.end 
AND issues.pubdate>=subs.start 

爲了我,儘管有限,SQL我需要使用外部的知識加入讓每一個用戶,即使他們沒有雜誌。但這似乎並不工作

任何幫助,將不勝感激。

+0

沒有人會幫你,直到你提供的腳本,在第一次讀到[文章](http://tkyte.blogspot.de/2005/06/how-to-ask-questions .html) – zaratustra 2014-08-29 09:49:09

+0

既然你想要所有的用戶,'users'應該是'FROM'表,然後你應該用另外兩個表'LEFT JOIN'。 – Barmar 2014-08-29 09:50:10

+0

@zaratustra感謝您的鏈接,這非常有用。對不起,如果我的帖子寫得不好 – 2014-08-29 09:57:25

回答

0

您所查詢的主工作臺應users。那你還有另外兩張表,因爲那些表格可能沒有匹配。

SELECT users.email, subs.code, issues.issue 
FROM users 
LEFT JOIN subs ON users.code = subs.code 
LEFT JOIN issues ON subs.mag = issues.mag AND issues.pubdate BETWEEN subs.start AND subs.end 

DEMO

+0

爲了澄清,如果我得到這個正確的,這個目前返回給我的所有用戶有一個子列表,但不是完整的用戶列表。我需要後者。我又錯過了什麼嗎? – 2014-08-29 10:17:37

+0

它爲我工作。看演示。它返回所有用戶。對於laracroft,'code'和'issue'是空的,因爲她的代碼不匹配任何潛艇。對於foo,'issue'爲空,因爲沒有問題在子的開始範圍內。 – Barmar 2014-08-29 10:25:03

+0

我看到你的小提琴,非常感謝。它也適用於NULL代碼值,這是我的情況。 – 2014-08-29 10:26:18

0

的最後一個查詢missies外連接類型(左或右):

所以正確的查詢將是:

SELECT subs.code, issues.issue, users.email 
FROM subs 
LEFT JOIN issues 
ON subs.mag=issues.mag 
LEFT JOIN users 
ON subs.code=users.code 
WHERE issues.pubdate<=subs.end 
AND issues.pubdate>=subs.start