我有一个问题,我认为可以通过适当使用左外部联接来解决,但我无法构造合适的查询。 OTOH,可能还有其他一些更聪明的SQL解决方案。另外,这可以通过一些编程轻松解决,但我想避免这种情况,并找到尽可能“干净”的解决方案。

背景:假设我正在创建一个列出一些汽车品牌的网站,用户可以选择自己拥有/拥有的汽车品牌(我并不是真的这样做,但是这个示例说明了这一点)。此外,对于选定的用户,他可以选择输入有关它们的其他信息,例如年和一些自由文本,例如特定模型,评论或其他内容。此外,输入的信息存储在关系数据库(在我的情况下为MySQL)中,用户以后可以检索和更改其答案。

假设有两个数据库表:

BRAND
------------
ID INT
NAME VARCHAR(50)

OWNED
------------
ID INT
BRAND_ID INT
OWNER_ID INT
YEAR INT
COMMENT VARCHAR(100)


(此处BRAND_ID + OWNER_ID是唯一索引,因此只能有一行,因此,每个BRAND / OWNER组合的年数和注释)

这些表中的数据可能看起来像这样:

BRAND
--------------
ID | NAME
--------------
1  | Cadillac
2  | Chevrolet
3  | Dodge
4  | Ford

OWNED
-----------------------------------------
ID | BRAND_ID | OWNER_ID | YEAR | COMMENT
-----------------------------------------
1  | 1        | 1        | null | 70's Fleetwood
2  | 2        | 1        | 2000 | Crappy car
3  | 2        | 2        | null | I really liked it
4  | 4        | 2        | 1999 | null


现在,为了方便轻松地创建网页,我想用一个SELECT在表BRAND中显示所有品牌,并让每个BRAND知道当前用户是否拥有它,以及是否拥有它。列出他的年份并发表评论(如果有)。换句话说,如下所示(假设当前用户为2):

NAME      | OWNER_ID | YEAR | COMMENT
-------------------------------------
Cadillac  | null     | null | null
Chevrolet | 2        | null | I really liked it
Dodge     | null     | null | null
Ford      | 2        | 1999 | null


我尝试做类似的事情:

select NAME, OWNER_ID, YEAR, COMMENT from BRAND left join OWNED on
BRAND.ID = OWNED.BRAND_ID where OWNER_ID = 2 or OWNER_ID = null


但这失败了,因为1拥有凯迪拉克,因此从结果中留下了凯迪拉克。 OTOH如果省略where子句,则将为雪佛兰获得两行,这也是不希望的。

因此,如果有一个干净的SQL解决方案(带或不带左外部联接),我想知道怎么做?

最佳答案

我猜你想要这个:

select NAME, OWNER_ID, YEAR, COMMENT
from BRAND left join
     OWNED o
     on BRAND.ID = OWNED.BRAND_ID and OWNER_ID = 2 ;

关于mysql - 左外部联接具有多个匹配项,如何返回特定的匹配项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39599729/

10-10 23:33