MySQL加入并分组,因此每行有一个ID

MySQL加入并分组,因此每行有一个ID,mysql,join,group-by,Mysql,Join,Group By,两个表:products,所有ID都是唯一的,stock,其中可以多次使用相同的ID。我需要比较产品表中的数量与库存表中的总数量不匹配的数量 产品 ID quantity 1 4 2 6 3 2 股票: ID quantity 1 1 1 3 2 5 3 2 如果每行只有一个ID,如何获得结果?预期结果: ID quantity as products quantity as stock

两个表:products,所有ID都是唯一的,stock,其中可以多次使用相同的ID。我需要比较产品表中的数量与库存表中的总数量不匹配的数量

产品

ID     quantity
1      4
2      6
3      2
股票:

ID     quantity
1      1
1      3
2      5
3      2
如果每行只有一个ID,如何获得结果?预期结果:

ID     quantity as products     quantity as stock

2      6                        5

您可以有一个子查询来计算总库存,并将其左键联接到products表:

您可以在dbfiddle上找到示例数据以及一些额外的数据来处理null和此解决方案

您还可以将WHERE子句更改为:

    -- We use coalesce to convert nulls to 0 (we assume *don't know* means *don't have*)
    coalesce(total_stock.quantity,0) <> coalesce(products.quantity, 0)
取决于您的用例

小提琴

参考资料:

MySQL MySQL
非常感谢。很好用!为ma节省了不少时间。查询工作正常。但不确定“-我们用来不安全地检查空值”是什么意思。我遇到了这样的情况:id_产品在一个表中,但不在另一个表中,即NULL,并且它没有显示它。上下文:一个表是我们的网上商店,有可供购买的可用数量,另一个表是手动检查实际库存。因此,我需要从销售中删除实际上没有库存的产品。
CREATE TABLE products
(
    ID INTEGER PRIMARY KEY,
    quantity INTEGER NOT NULL
) ;

CREATE TABLE stock
(
    ID INTEGER NOT NULL REFERENCES products(ID),
    quantity INTEGER NOT NULL
) ;
    -- We use coalesce to convert nulls to 0 (we assume *don't know* means *don't have*)
    coalesce(total_stock.quantity,0) <> coalesce(products.quantity, 0)