缺少外键时如何使用默认值 - mysql
How to use default value when foreign key is missing - mysql
我有两个table这样的
- 促销 (item_id, seller_id, 价格);
- 卖家(id, name, address);
sale
table 中的某些记录可能包含 seller_id 在 seller
table 中不存在的记录。
例如:
促销 table:
item_id
seller_id
price
1
100
55
2
101
33
3
101
44
卖家table:
id
name
address
101
Ann
13 str
102
Ben
55 hs.xxx
103
Anthony
no add
我想查询所有带卖家名字的销量。如果卖家不存在,则使用默认名称或为空。该查询的结果 table 是这样的:
item_id
seller_name
1
2
Ann
3
Ann
我尝试加入 tables 条件 sale.seller_id = seller.id
,但它删除了卖家不存在的项目
这可以使用 COALESCE(val_1, val_2, val_3, ...val_n)
优雅地实现,它被描述为 COALESCE() 函数 returns 列表中的第一个非空值。
只需将target_column
替换为COALESCE(target_column, default_value)
把它们放在一起,你可以做类似的事情。
select item_id, COALESCE(name, '') as seller_name
from sale
left join seller on sale.seller_id = seller.id;
注意:如果您想使用其他值作为默认值,请将空单引号替换为 'default name'
在此处阅读更多内容 -> https://www.w3schools.com/mysql/func_mysql_coalesce.asp
好的,所以我认为这应该不会太糟糕。您可以使用 LEFT JOIN
获得第三个 table 中描述的行为。 Here's an example of LEFT JOIN
.
为了您自己的笔记,我这样做了 using this online MySQL instance,但这应该可以与 MySQL 的其他实例一起使用。
我重新创建了下面的 tables,我相信这给了我你所拥有的。由于我们对 id
字段和 seller_id
字段不匹配的情况感兴趣,我们实际上可以在此处添加任意数量的示例,只要有几个缺少字段或Seller
table.
中的两个
CREATE TABLE Sale(item_id integer, seller_id integer, price integer);
INSERT INTO Sale(item_id, seller_id, price) VALUES
(1, 100, 55),
(2, 101, 33),
(3, 101, 44);
CREATE TABLE Seller(id integer, name varchar(20), addr varchar(20));
INSERT INTO Seller(id, name, addr) VALUES
(101, "Ann", "13 str"),
(102, "Ben", "55 hs.xxx"),
(103, "Anthony", "no add");
从这里开始,您只需执行左连接即可获得所需的 table。我还用 CASE
替换了名称变量,当返回 NULL 时,用您选择的名称替换 NULL
s。
SELECT Sale.item_id,
CASE WHEN Seller.name is NULL THEN "Default name" ELSE Seller.name END AS seller_name
FROM Sale
LEFT JOIN Seller
ON Sale.seller_id = Seller.id;
这 returns 给我们一个 table 包含他们的卖家感兴趣的项目,并且由于 Seller
中缺少条目,item_id=1
有一个seller_id
.
的 NULL 字段
进行编辑,因为我还没有足够的声誉来发表评论:Harsh 的解决方案看起来干净多了,但我会留下我的,以防它对你仍然有用。
我有两个table这样的
- 促销 (item_id, seller_id, 价格);
- 卖家(id, name, address);
sale
table 中的某些记录可能包含 seller_id 在 seller
table 中不存在的记录。
例如:
促销 table:
item_id | seller_id | price |
---|---|---|
1 | 100 | 55 |
2 | 101 | 33 |
3 | 101 | 44 |
卖家table:
id | name | address | ||
---|---|---|---|---|
101 | Ann | 13 str | ||
102 | Ben | 55 hs.xxx | ||
103 | Anthony | no add |
我想查询所有带卖家名字的销量。如果卖家不存在,则使用默认名称或为空。该查询的结果 table 是这样的:
item_id | seller_name |
---|---|
1 | |
2 | Ann |
3 | Ann |
我尝试加入 tables 条件 sale.seller_id = seller.id
,但它删除了卖家不存在的项目
这可以使用
COALESCE(val_1, val_2, val_3, ...val_n)
优雅地实现,它被描述为 COALESCE() 函数 returns 列表中的第一个非空值。只需将
target_column
替换为COALESCE(target_column, default_value)
把它们放在一起,你可以做类似的事情。
select item_id, COALESCE(name, '') as seller_name from sale left join seller on sale.seller_id = seller.id;
注意:如果您想使用其他值作为默认值,请将空单引号替换为 'default name'
在此处阅读更多内容 -> https://www.w3schools.com/mysql/func_mysql_coalesce.asp
好的,所以我认为这应该不会太糟糕。您可以使用 LEFT JOIN
获得第三个 table 中描述的行为。 Here's an example of LEFT JOIN
.
为了您自己的笔记,我这样做了 using this online MySQL instance,但这应该可以与 MySQL 的其他实例一起使用。
我重新创建了下面的 tables,我相信这给了我你所拥有的。由于我们对 id
字段和 seller_id
字段不匹配的情况感兴趣,我们实际上可以在此处添加任意数量的示例,只要有几个缺少字段或Seller
table.
CREATE TABLE Sale(item_id integer, seller_id integer, price integer);
INSERT INTO Sale(item_id, seller_id, price) VALUES
(1, 100, 55),
(2, 101, 33),
(3, 101, 44);
CREATE TABLE Seller(id integer, name varchar(20), addr varchar(20));
INSERT INTO Seller(id, name, addr) VALUES
(101, "Ann", "13 str"),
(102, "Ben", "55 hs.xxx"),
(103, "Anthony", "no add");
从这里开始,您只需执行左连接即可获得所需的 table。我还用 CASE
替换了名称变量,当返回 NULL 时,用您选择的名称替换 NULL
s。
SELECT Sale.item_id,
CASE WHEN Seller.name is NULL THEN "Default name" ELSE Seller.name END AS seller_name
FROM Sale
LEFT JOIN Seller
ON Sale.seller_id = Seller.id;
这 returns 给我们一个 table 包含他们的卖家感兴趣的项目,并且由于 Seller
中缺少条目,item_id=1
有一个seller_id
.
进行编辑,因为我还没有足够的声誉来发表评论:Harsh 的解决方案看起来干净多了,但我会留下我的,以防它对你仍然有用。