2016-04-26 11 views
0

ich die folgenden zwei SQL-Tabellen haben (in MySQL):MYSQL - Finden Sie Datensätze aus einer Tabelle, die in einem anderen nicht existieren

Users | id | name | |----|------| | 1 | Luke | | 2 | Mark | | 3 | Lucy | | 4 | Biff |

User category | user_id | category_id | |---------|-------------| | 1 | 5 | | 1 | 6 | | 2 | 5 | | 2 | 7 | | 3 | 5 |

ich Benutzer möchten, sind in der Benutzerkategorie, aber nicht wenn die Kategorie-ID 6 ist.

In diesem Fall Mark und Lucy, weil Luke auch in Kategorie 6 ist und Biff keine Kategorie hat.

Es gibt eine Möglichkeit, dies ohne Unterabfrage und nur in einer Abfrage zu tun?

+2

Gibt es einen Grund dahinter * Es gibt eine Möglichkeit, es ohne Unterabfrage zu tun und nur in einer Abfrage? * –

+0

Kein besonderer Grund, es ist nur aus konzeptionellen Gründen – Vega

Antwort

4

Sie können group by user_id und die Zeilen eliminieren, wo es atleast ist ein category_id von 6.

select uc.user_id,u.name 
from user_category uc 
join users u on uc.user_id = u.id 
group by uc.user_id,u.name 
having sum(case when category_id = 6 then 1 else 0 end) = 0 
+2

'HAVING COUNT (Fall wenn category_id = 6 dann 1 END) <> 1' –

0

sie Mitglied werden und prüfen Unterschied:

SELECT * FROM users 
INNER JOIN user_category ON (user_category.user_id = users.id) 
WHERE user_category.category_id <> 6 

P. S. Die Verwendung von group by ist nicht effektiv, denn es sagt der DB-Engine, dass sie nach dem Sammeln von Daten zusätzliche Gruppenoperationen durchführen soll.

+1

Ich denke, Sie haben es versäumt, die letzte Zeile zu lesen * Es gibt einen Weg, es ohne Unterabfrage zu tun und nur in einer Abfrage? –

+0

ohne Unterabfrage – Vega

+0

@Prdp, Jungs, ich war wrtiting, plötzlich Klicken Sie auf Senden (: – num8er

Verwandte Themen