首页 > 解决方案 > Mysql选择查询不在同一张表中

问题描述

我有一个名为 products 的表,有 3 列。其中一列是product_id。此列包含重复的产品 ID。从另一个来源,我得到了一些其他的产品 ID。我想显示不存在的产品 ID 计数。例如,我从一个来源获取产品 ID 12、13、14、15、16。在我的产品表中,我有 12、13、14。所以现在我想显示不存在的产品 ID 的计数。在这种情况下,应该是 2。为了实现这一点,我尝试了以下查询。

SELECT COUNT(DISTINCT product_id) 
FROM products p1 
WHERE NOT EXISTS 
    (SELECT COUNT(DISTINCT product_id) 
     FROM products p2 
     WHERE p2.product_id IN (12,13,14,15,16) AND p1.product_id = p2.product_id)

但我得到的是空的结果。任何帮助将不胜感激。

标签: mysqlsql

解决方案


如果产品列表来自应用程序,并且您也知道列表的长度(在本例中为 5),您可以在表格中找到不存在的产品的数量,如下所示:

SELECT 5 - COUNT(DISTINCT product_id) AS non_existent_products
FROM products
WHERE product_id IN (12, 13, 14, 15, 16)

输出

non_existent_products
2

如果您不知道列表的长度,可以使用例如

LENGTH('(12, 13, 14, 15, 16)') - LENGTH(REPLACE('(12, 13, 14, 15, 16)', ',', '')) + 1

dbfiddle 上的演示

更新

如果其他product_id值来自另一个查询(例如),您可以使用该查询的结果中的一个与 products 表并从两者中获取 s 的差异来查找SELECT product_id FROM othertable该结果中不在products表中的产品计数. 像这样的东西:LEFT JOINCOUNTproduct_id

SELECT COUNT(DISTINCT q.product_id) - COUNT(DISTINCT p.product_id) AS non_existent_products
FROM (SELECT product_id FROM products2) q
LEFT JOIN products p ON p.product_id = q.product_id

dbfiddle 上的演示


推荐阅读