mysql - OUTER JOIN MySQL 中的三个不同表时出现的问题

标签 mysql sql database join

大家早上好

语境
我处于这种情况:我有三个这样结构的表(为简洁起见省略了 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

DEMO

关于mysql - OUTER JOIN MySQL 中的三个不同表时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25565708/

相关文章:

sql - LAG(...) IGNORE NULLS OVER (ORDER BY...)

mysql - 在 SQL 中使用 AUTO_INCRMENT 时是否需要设置 NOT NULL?

javascript - MySQL 在 Sequelize 5 中返回 STRING 而不是 JSON

javascript - 用nodejs保存DateTime mysql

SQL,基于需要重新选择的插入值的foreach-loop-like INSERT,可能吗?

mysql - "key buffer size"和 "total MyISAM indexes"单位大小是什么意思?

mysql - 根据其中一个表中特定列中的最大值返回 JOIN 结果

database - 国家/州/城市数据库?

mysql - 从文本/url 快速生成数字 id "SELECT"

php - 合并同一服务器上多个站点的登录/注册