2009-06-09 6 views
1

Ich habe zwei Tabellenwie kann ich aus einer Tabelle auswählen, basierend auf nicht Übereinstimmungen in einem anderen in mySQL

PUNKTE: id, name

KATEGORIEN: items_id, Kategorie

Ich brauche alle auszuwählen die Elemente, deren IDs nicht in der KATEGORIES-Tabelle enthalten sind.

Ich vermute, es ist wirklich einfach, aber kann die Syntax nicht herausfinden.

+0

können Sie wirklich eine Spalte mit dem Namen "items.id" in den Kategorien Tabelle? –

+1

Entschuldigung, bearbeitet es um die Realität zu reflektieren :) –

Antwort

3

NICHT IN (wählen CATEGORIES.item_id)

nicht sicher, ob das schneller ist als die oben kommen ... aber es funktioniert.

+0

Das ist, wie ich es auch tun würde, und es ist viel einfacher. –

+1

Wenn die Leistung wichtig ist ... Profile beide Versionen. Das heißt, mein erster (und wahrscheinlich einziger) Swing bei ihm wäre mit dem NOT IN. – Adrien

+0

Ich bevorzuge die Verwendung der LINKEN JOIN über die NOT IN, weil in der Vergangenheit ich mit der Abfrage nicht mit dem Index gebrannt wurde und einfache Joins normalerweise die Indizes richtig verwenden. Ich bin nicht vertraut genug mit MySQL, um zu wissen, welche schneller laufen wird, aber wenn beide den Index verwenden, sind sie genau der gleiche Ausführungsplan. –

0

Dies wählt alles aus der Items-Tabelle und nur die Datensätze aus den Kategorien aus, die dem Join entsprechen. Dann filtere die Nullen heraus.

Select Item.Id 
FROM ITEMS LEFT OUTER JOIN CATEGORIES On 
Items.Id = Categories.items_id 
where categories.items_id is null 
+0

MySQL Felder sind nicht Groß-und Kleinschreibung. Der Code ist wirklich schlampig, also genehmige ich Ihren Downvote. –

+0

+1, Ich mag die linke Join-Methode über die NOT IN –

3

versuchen Sie dies:

SELECT 
    i.* 
    FROM Items i 
     LEFT OUTER JOIN Categories c ON i.id=c.items_id 
     WHERE c.items_id is NULL 
0

Wie wäre es

SELECT id 
, name 
FROM ITEMS 
WHERE NOT EXISTS(SELECT 1 FROM CATEGORIES WHERE Categories.items.id = ITEMS.id) 

Dies wird nur Produkte zurückbringen, die zumindest einen Eintrag in der Tabelle Kategorien

0
SELECT items.id 
    FROM items 
WHERE NOT EXISTS(SELECT * 
        FROM categories 
        WHERE items.id = categories.items.id) 

Dies ist die gleiche wie Verbindung zu den Kategorien Tabelle nicht als Mike haben Pone und KM aufgelistet, aber ich finde das besser lesbar.

2
SELECT * FROM Items 
WHERE id NOT IN (SELECT items_id FROM Categories) 
Verwandte Themen