繁体   English   中英

SQL左独立连接两个表

[英]SQL left join two tables independently

如果我有这些表:

Thing
id | name
---+---------
1  | thing 1
2  | thing 2
3  | thing 3

Photos
id | thing_id | src
---+----------+---------
1  | 1        | thing-i1.jpg
2  | 1        | thing-i2.jpg
3  | 2        | thing2.jpg

Ratings
id | thing_id | rating
---+----------+---------
1  | 1        | 6
2  | 2        | 3
3  | 2        | 4

我如何加入他们的队伍

id | name    | rating | photo
---+---------+--------+--------
1  | thing 1 | 6      | NULL
1  | thing 1 | NULL   | thing-i1.jpg
1  | thing 1 | NULL   | thing-i2.jpg

2  | thing 2 | 3      | NULL
2  | thing 2 | 4      | NULL
2  | thing 2 | NULL   | thing2.jpg

3  | thing 3 | NULL   | NULL

即,同时在每个表上左联接,而不是在左一个联接上而不在下一个联接?

是我能得到的最接近的:

SELECT Thing.*, Rating.rating, Photo.src
From Thing
Left Join Photo on Thing.id = Photo.thing_id
Left Join Rating on Thing.id = Rating.thing_id

您可以通过并集获得所需的结果,这似乎是最明显的,因为您从排名或照片中返回了一个字段。

您的其他情况(都不存在)通过使连接成为left join而不是inner joins 您将获得一条重复记录,其中NULL, NULL排名,照片为NULL, NULL 你可以通过很多移动到一个子查询筛选了这一点,并做select distinct主查询,但比较明显的解决办法是更换union all通过union ,这也过滤掉重复。 更容易阅读。

select
  t.id,
  t.name,
  r.rating,
  null as photo
from
  Thing t
  left join Rating r on r.thing_id = t.id
union
select
  t.id,
  t.name,
  null,
  p.src
from
  Thing t
  left join Photo p on p.thing_id = t.id
order by
  id,
  photo,
  rating

MySQL不支持完全外部联接,因此您必须使用UNION来解决它:

这是小提琴: http ://sqlfiddle.com/#!2/ d3d2f/13

SELECT *
FROM (
    SELECT Thing.*,
           Rating.rating,
           NULL AS photo
    FROM Thing
    LEFT JOIN Rating ON Thing.id = Rating.thing_id

    UNION ALL

    SELECT Thing.*,
           NULL,
           Photo.src
    FROM Thing
    LEFT JOIN Photo ON Thing.id = Photo.thing_id
) s
ORDER BY id, photo, rating

这是我想出的:

SELECT
  Thing.*,
  rp.src,
  rp.rating
FROM
  Thing
  LEFT JOIN (
    (
      SELECT
        Photo.src,
        Photo.thing_id AS ptid,
        Rating.rating,
        Rating.thing_id AS rtid
      FROM
        Photo
        LEFT JOIN Rating
          ON 1 = 0
    )
    UNION
    (
      SELECT
        Photo.src,
        Photo.thing_id AS ptid,
        Rating.rating,
        Rating.thing_id AS rtid
      FROM
        Rating
        LEFT JOIN Photo
          ON 1 = 0
    )
  ) AS rp
    ON Thing.id IN (rp.rtid, rp.ptid)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM