MySQL选择查询不在同一表中

时间:2019-01-18 11:56:36

标签: mysql sql

我有一个名为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)

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

4 个答案:

答案 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

Demo on dbfiddle

更新

如果其他product_id值来自另一个查询(例如SELECT product_id FROM othertable),则可以使用{{来查找该结果中不在products表中的产品数1}}的查询结果与products表一起使用,并取两者中LEFT JOIN的{​​{1}}中的差异。像这样:

COUNT

Demo on dbfiddle

答案 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)