Ich habe eine Tabelle namens Produkte mit 3 Spalten. Eine der Spalten ist product_id. Diese Spalte enthält doppelte Produkt-IDs. Von einer anderen Quelle erhielt ich einige andere Produkt-IDs. Ich möchte die Anzahl der nicht vorhandenen Produkt-IDs anzeigen. Zum Beispiel erhalte ich die Produkt-IDs 12,13,14,15,16 aus einer Hand. In meiner Produkttabelle habe ich 12,13,14. Jetzt möchte ich die Anzahl der nicht vorhandenen Produkt-IDs anzeigen. In diesem Fall sollte das 2 sein. Um dies zu erreichen, habe ich es mit der folgenden Abfrage versucht.

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)

Aber ich bekomme ein leeres Ergebnis. Jede Hilfe wäre sehr dankbar.

-1
user3408779 18 Jän. 2019 im 14:56

4 Antworten

Beste Antwort

Wenn die Liste der Produkte aus einer Anwendung stammt und Sie auch die Länge der Liste kennen (in diesem Fall 5), finden Sie die Anzahl der nicht vorhandenen Produkte in der folgenden Tabelle:

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

Ausgabe

non_existent_products
2

Wenn Sie die Länge der Liste nicht kennen, können Sie sie mit z.

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

Demo auf DBFiddle

Aktualisieren

Wenn die anderen product_id -Werte aus einer anderen Abfrage stammen (z. B. SELECT product_id FROM othertable), können Sie die Anzahl der Produkte in diesem Ergebnis, die nicht in der products -Tabelle enthalten sind, mithilfe eines LEFT JOIN ermitteln. der Ergebnisse dieser Abfrage mit der Produkttabelle und unter Berücksichtigung der Differenz in COUNT s von product_id von den beiden. Etwas wie das:

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

Demo auf DBFiddle

3
Nick 18 Jän. 2019 im 19:54

Nehmen wir an, wir haben 2 Tabellen mit den folgenden Werten:

INSERT INTO `products` (`product_id`)
             VALUES    (1),(2),(3),(4),(1),(3),(1),(2),(5)
;

INSERT INTO `other_products` (`product_id`)
             VALUES    (2),(4)
;

Diese Abfrage gibt Ihnen dann die Anzahl der IDs 1, 3 und 5 (in other_products nicht vorhanden).

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`
;  

In diesem Fall erhalten Sie die Gesamtzahl der eindeutigen IDs, die in der anderen Tabelle nicht vorhanden sind

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

Siehe Live-Demo

1
Quasimodo's clone 18 Jän. 2019 im 14:09

Sie können so etwas verwenden

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

Hier wählen Sie eine eindeutige product_id aus dem Tabellenprodukt aus, wobei die Produkt-IDs nicht gleich 1 und 2 sind, und erstellen dann einen Alias für das Ergebnis als A.

A fungiert als temporäre Tabelle, daher müssen Sie zur Auswahl A.product_id verwenden.

Entschuldigung für das schlechte Englisch, aber ich hoffe, es erfüllt die Anforderungen der Frage.

0
Sameer Reza Khan 18 Jän. 2019 im 12:08

Das Problem, das Sie haben, ist, dass Ihre Unterabfrage immer einen Wert zurückgibt (manchmal gibt sie 0 zurück). Wenn Sie also NICHT EXISTS (), ist es immer FALSCH, weil Sie immer eine Antwort erhalten. Sie sollten NOT EXISTS um 0> so ändern

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
nacho 18 Jän. 2019 im 12:16