大家早上好。
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用户,即使他们没有杂志。但这似乎不起作用
任何帮助都将不胜感激。
答案 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