SQL:具有类似表

时间:2017-11-17 16:12:12

标签: mysql sql laravel join laravel-5

我有以下表格:

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值。 / p>

有没有办法进行不会使用NULL值覆盖以前加入的数据的查询?我正在使用Laravel Eloquent,因此任何原始SQL或Eloquent Query都可以帮助我。

3 个答案:

答案 0 :(得分:1)

  

但绝不是两个

祝你好运。

  

id |信息|问题|选择|线

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

答案 1 :(得分:0)

您可以使用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`

请务必使用JOININNER JOINJOIN默认为INNER JOIN在MySQL上)而不是LEFT JOINRIGHT JOIN,{{ 1}}否则你最终会得到部分填充的结果。

答案 2 :(得分:0)

UNION BC以及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