OUTER在MySQL中加入三个不同的表时的问题

时间:2014-08-29 09:44:53

标签: mysql sql database join

大家早上好。

CONTEXT
我处于这种情况:我有三个以这种方式构建的表格(省略id为简洁)

SUBS:code,mag,start,end
用户:代码,电子邮件
问题:issue,mag,pubdate

"潜艇"包含对杂志的订阅: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, johndoe@mail.com  
       C0003072, laracroft@mail.com  

我想要实现的目标
包含他们有权查看的杂志的所有用户的列表。如果他们的子中没有杂志,我只需要用户。所以,对于之前的例子:

johndoe@mail.com, 01ARS14000387
johndoe@mail.com, 01ARS14000388
johndoe@mail.com, 01ARS14000389
laracroft@mail.com, 01ARS14000387
laracroft@mail.com, 01ARS14000388
laracroft@mail.com, 01ARS14000389

我感到困难 我写了两个不同的查询:

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我需要使用外连接来获得EACH用户,即使他们没有杂志。但这似乎不起作用

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

最后一个查询会遗漏外连接类型(左或右):

所以正确的查询将是:

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

答案 1 :(得分:0)

查询的主要表格应为users。然后你LEFT JOIN其他两个表,因为那些表可能没有匹配。

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