【问题标题】:SQL : Multiple left joins with similar tablesSQL:具有相似表的多个左连接
【发布时间】: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 都会对我有所帮助。

【问题讨论】:

标签: mysql sql laravel join laravel-5


【解决方案1】:

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

【讨论】:

    【解决方案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`
    

    确保使用 JOININNER JOINJOIN 在 MySQL 上默认为 INNER JOIN)而不是 LEFT JOINRIGHT JOINOUTER JOIN,否则您将得到部分填充的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2010-11-10
      相关资源
      最近更新 更多