gpt4 book ai didi

mysql - 左外连接有多个匹配项,如何返回特定的一个?

转载 作者:行者123 更新时间:2023-11-29 11:16:46 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com