大家早上好
语境
我处于这种情况:我有三个这样结构的表(为简洁起见省略了 id)
SUBS: code, mag, start, end
用户:代码,电子邮件
问题:问题、杂志、发布日期
“subs”包含对杂志的订阅:CODE是公司代码,MAG是杂志的标识符,START和END是订阅有效的日期。
“用户”包含与公司代码相关联的电子邮件 (1/N)
“issues”是每本杂志每期的列表,及其出版日期
样本数据
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
这正确地给了我一家公司应该看的所有杂志的 list
以下步骤是我遇到问题的地方。我尝试将单个查询放在一起以获得上述期望的结果,但我不断收到我不理解的语法错误。这是我的查询:
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 知识有限,但我需要使用外部联接来获取每个用户,即使他们没有杂志。但这似乎不起作用
如有任何帮助,我们将不胜感激。
最佳答案
查询的主表应该是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
关于mysql - OUTER JOIN MySQL 中的三个不同表时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25565708/