Mysql select запрос NOT IN в той же таблице - PullRequest
0 голосов
/ 18 января 2019

У меня есть таблица продуктов с 3 столбцами. Одним из столбцов является product_id. Этот столбец содержит повторяющиеся идентификаторы продуктов. Из другого источника я получал другие идентификаторы продуктов. Я хочу отобразить количество несуществующих идентификаторов продуктов. Например, я получаю идентификаторы продукта 12,13,14,15,16 из одного источника. В моей таблице продуктов у меня 12,13,14. Итак, теперь я хочу отобразить количество несуществующих идентификаторов продукта. В данном случае это должно быть 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 голосов
/ 18 января 2019

Предположим, у нас есть 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`
;  

в то время как этот дает вам общие идентификаторы, которых нет в другой таблице

SELECT count(DISTINCT `p`.`product_id`)
  FROM       `products`        `p`
  LEFT JOIN  `other_products`  `o`
  USING      (`product_id`)
  WHERE `o`.`product_id` IS NULL
;  

См. Демонстрация в реальном времени

0 голосов
/ 18 января 2019

вы можете использовать что-то вроде этого

select count(A.product_id) from (select distinct product_id from product where product_id not in (1,2)) AS A;

здесь вы выбираете отдельный product_id из таблицы product, где идентификаторы продуктов не равны 1 и 2, а затем создаете псевдоним для результата как A.

A действует как временная таблица, поэтому вам нужно использовать A.product_id для выбора.

Извините за плохой английский, но я надеюсь, что он отвечает требованию вопроса.

0 голосов
/ 18 января 2019

Проблема в том, что ваш подзапрос всегда возвращает значение (иногда возвращает 0), поэтому, когда вы НЕ СУЩЕСТВУЕТЕ (), оно всегда ЛОЖЬ, потому что вы всегда получаете ответ. Вы должны изменить НЕ СУЩЕСТВУЕТ на 0> как это

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)
0 голосов
/ 18 января 2019

Если список продуктов взят из приложения, и вы также знаете длину списка (в данном случае 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 получены из другого запроса (например, SELECT product_id FROM othertable), вы можете найти количество продуктов в этом результате, которых нет в таблице products, используя LEFT JOIN результатов этого запрос с таблицей продуктов и принимая разницу в COUNT с product_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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...