【问题标题】:How to use default value when foreign key is missing - mysql缺少外键时如何使用默认值 - mysql
【发布时间】:2021-08-16 08:44:53
【问题描述】:

我有两张这样的桌子

  • 销售(item_id、seller_id、价格);
  • 卖家(身份证、姓名、地址);

sale表中的某些记录可能包含seller表中不存在seller_id的记录。

例如:

销售表:

item_id seller_id price
1 100 55
2 101 33
3 101 44

卖家表:

id name address
101 Ann 13 str
102 Ben 55 hs.xxx
103 Anthony no add

我想用卖家的名字查询所有的销售。如果卖家不存在,则使用默认名称或为空。该查询的结果表如下所示:

item_id seller_name
1
2 Ann
3 Ann

我尝试加入条件为sale.seller_id = seller.id 的表格,但它删除了卖家不存在的商品

【问题讨论】:

  • "sale表中的某些记录可能包含seller_id在seller表中不存在的记录。" - 那么你应该解决实际问题......
  • 这个问题是之前开始的,需要时间收集缺失的数据。所以我需要找到一些解决方法

标签: mysql sql join inner-join


【解决方案1】:
  • 这可以使用COALESCE(val_1, val_2, val_3, ...val_n) 优雅地实现,它被描述为COALESCE() 函数返回列表中的第一个非空值。

  • 只需将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;
    
  • 注意:如果您想使用其他值作为默认值,请将空单引号替换为“默认名称”

  • 在这里阅读更多 -> https://www.w3schools.com/mysql/func_mysql_coalesce.asp

【讨论】:

  • 你能提供我的案子查询吗
【解决方案2】:

好的,所以我认为这应该不会太糟糕。您可以使用LEFT JOIN 获得第三个表中描述的行为。 Here's an example of LEFT JOIN.

为了您自己的笔记,我这样做了using this online MySQL instance,但这应该适用于其他 MySQL 实例。

我重新创建了下面的表格,我相信这些表格给了我你所拥有的。由于我们对id 字段和seller_id 字段不匹配的情况感兴趣,因此我们实际上可以在此处添加任意数量的示例,只要有几个在@ 中缺少一两个字段即可987654327@表。

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");

从这里,您只需执行左连接即可获得您想要的表格。我还将 name 变量替换为 CASE,当返回 NULL 时,将 NULLs 替换为您选择的名称。

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;

这将返回给我们一个包含卖家感兴趣的项目的表格,并且由于Seller 中缺少条目,item_id=1seller_id 有一个 NULL 字段。

编辑因为我还没有足够的声誉来发表评论:Harsh 的解决方案看起来更干净,但我会留下我的,以防它对你仍然有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2014-10-12
    相关资源
    最近更新 更多