SQL:具有相似表的多个左连接
Posted
技术标签:
【中文标题】SQL:具有相似表的多个左连接【英文标题】:SQL : Multiple left joins with similar tables 【发布时间】:2018-05-01 11:30:45 【问题描述】:我有以下表格:
TABLE A
id
info
TABLE B
f_id
question
choices
TABLE C
f_id
question
lines
表 A 中的 id 始终与表 B 或 C 中的 f_id 匹配,但绝不会同时匹配两者。我只想在表 A 匹配时加入表 B 和表 C,因此我会得到一个包含以下列的表:
id | info | question | choices | lines
所有行都填写在问题列中,有些在列选择中为 NULL,有些在列行中为 NULL。
我尝试的是做两个连续的左连接,但第二个覆盖第一个,因此表 C 中不匹配的所有行(第二个左连接)在问题列中获得 NULL 值。
有没有办法进行查询,不会覆盖以前使用 NULL 值连接的数据?我正在使用 Laravel Eloquent,因此任何原始 SQL 或 Eloquent Query 都会对我有所帮助。
【问题讨论】:
考虑在 A 和 B 和 C 的外连接之间进行内连接。 查看此定义以获得帮助:***.com/questions/38549/… 你应该使用关系...laravel.com/docs/5.5/eloquent-relationships 我会为此使用联合 如果您使用 laravel,我不明白您为什么要使用 Raw SQL... 【参考方案1】:UNION
B
和 C
然后 INNER JOIN
A
到这些结果。
SELECT s1.f_id, s1.question, s1.choices, s1.lines
FROM
(
SELECT f_id, question, choices, lines = null
FROM B
UNION
SELECT f_id, question, choices = null, lines
FROM C
) s1
INNER JOIN A ON s1.f_id = A.id
【讨论】:
【参考方案2】:但绝不会两者兼而有之
祝你好运。
标识 |信息 |问题 |选择 |线条
SELECT a.id, a.info, b.question, b.choices, '' AS lines
FROM tableA as A
LEFT JOIN tableB AS b
ON a.id=b.f_id
UNION
SELECT a.id, a.info, c.question, '', c.lines
FROM tableA as A
INNER JOIN tableC AS c
ON a.id=c.f_id
【讨论】:
第一个查询总是返回表 a 中的所有行。第二个查询有时会返回表 a 中的行。这意味着有时你会得到重复。如果 OP 意味着表 a 中的行在表 b 或 c 中总是有一个且完全匹配的行,您可以将左连接更改为内连接。并将该 UNION 更改为 UNION ALL...【参考方案3】:您可以使用UNION
组合两个不同的查询。
SELECT
`id`, `info`, `question`, `choices` AS `lines`
FROM
`TABLE_A` INNER JOIN
`TABLE_B` ON `TABLE_A`.`id` = `TABLE_B`.`f_id`
UNION
SELECT
`id`, `info`, `question`, `lines`
FROM
`TABLE_A` INNER JOIN
`TABLE_C` ON `TABLE_A`.`id` = `TABLE_C`.`f_id`
确保使用 JOIN
或 INNER JOIN
(JOIN
在 mysql 上默认为 INNER JOIN
)而不是 LEFT JOIN
、RIGHT JOIN
、OUTER JOIN
,否则您将得到部分填充的结果。
【讨论】:
以上是关于SQL:具有相似表的多个左连接的主要内容,如果未能解决你的问题,请参考以下文章
具有多个 postmeta 左连接的 Wordpress 自定义 SQL 查询
当涉及两个以上的表时,如何将来自相似字段的单个表的两个左连接转换为 LINQ? [复制]