我有一个问题,我认为可以通过适当使用左外部联接来解决,但我无法构造合适的查询。 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/