我有一个名为product的表格,其中包含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)
但是我得到的结果是空的。任何帮助将不胜感激。
答案 0 :(得分:3)
如果产品列表来自某个应用程序,并且您也知道列表的长度(在这种情况下为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
更新
如果其他product_id
值来自另一个查询(例如SELECT product_id FROM othertable
),则可以使用{{来查找该结果中不在products
表中的产品数1}}的查询结果与products表一起使用,并取两者中LEFT JOIN
的{{1}}中的差异。像这样:
COUNT
答案 1 :(得分:1)
假设,我们有2个表,其值如下:
INSERT INTO `products` (`product_id`)
VALUES (1),(2),(3),(4),(1),(3),(1),(2),(5)
;
INSERT INTO `other_products` (`product_id`)
VALUES (2),(4)
;
然后,该查询为您提供ID 1、3和5(other_products
中不存在)的计数
SELECT `p`.`product_id`, COUNT(`p`.`product_id`) `count`
FROM `products` `p`
LEFT JOIN `other_products` `o`
USING (`product_id`)
WHERE `o`.`product_id` IS NULL
GROUP BY `p`.`product_id`
;
与此同时,您可以看到另一张表中不存在的总不同ID
SELECT count(DISTINCT `p`.`product_id`)
FROM `products` `p`
LEFT JOIN `other_products` `o`
USING (`product_id`)
WHERE `o`.`product_id` IS NULL
;
请参见Live Demo
答案 2 :(得分:0)
您可以使用类似的东西
product_id
在此处,您要从表产品中选择不同的product_id,其中产品ID不等于1和2,然后为结果创建别名A。
A充当临时表,因此您需要使用A.product_id进行选择。
对不起,英语不好,但我希望它符合问题的要求。
答案 3 :(得分:0)
您遇到的问题是子查询始终返回一个值(有时返回0),所以当您不存在()时,它总是FALSE,因为您始终都能得到答案。 您应该像这样通过0>更改NOT EXISTS
SELECT COUNT(DISTINCT product_id)
FROM products p1
WHERE 0>
(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)