2012-04-02 3 views
3

Ich habe eine Tabelle Transaktionen (store_id, item_id, Preis). Ich möchte store_id's finden, die höchstens zwei verschiedene Artikel verkaufen, ohne aggregierte Funktionen und Gruppierungen zu verwenden.Wie finden Sie höchstens zwei Elemente in MySQL ohne Aggregationen und Gruppierungen

Gibt es eine Möglichkeit, das zu tun?

+0

+ 1'ed für die interessante Frage, aber warum Aggregate vermeiden? Ich wäre * sehr, sehr * neugierig, wenn ich beide von Michael geposteten Methoden vergleichen würde. – stefgosselin

Antwort

3

Interessante Anforderungen ... dies viel schneller sein würde und einfacher mit Aggregatfunktionen und Gruppierungen .. aber hier ist eine andere Art und Weise:

SELECT DISTINCT t1.store_id 
FROM 
    Transactions t1 
    LEFT JOIN Transactions t2 
     ON t1.store_id = t2.store_id 
     AND t1.item_id <> t2.item_id 
    LEFT JOIN Transactions t3 
     ON t1.store_id = t3.store_id 
     AND t3.item_id NOT IN (t1.item_id, t2.item_id) 
WHERE t3.store_id IS NULL 

Die Abfrage funktioniert, indem von einem Speicher Datensatz zu einem anderen Datensatz für die Verbindung gleicher Laden, aber anderer Artikel. Es versucht dann, zu einem dritten Datensatz für dasselbe Geschäft, aber anderes Element beizutreten. Wenn es diesen Datensatz findet, verkauft das Geschäft mehr als zwei Elemente und wird in der WHERE-Klausel ausgeschlossen.

Nur um Ihnen eine Vorstellung zu geben, ist hier, wie die Abfrage normal aussehen:

SELECT store_id 
FROM Transactions 
GROUP BY store_id 
HAVING COUNT(DISTINCT item_id) < 3 
+0

Wie schließt es die Geschäfte ein, die nur 1 Artikel oder keinen verkaufen? – CanCeylan

+0

@CanCeylan Der Speicher würde ausgeschlossen werden, da t3.store_id nicht "NULL" wäre, sondern die ID für den Datensatz, der das dritte Element enthält. Die Abfrage enthält Geschäfte, die nur ein einzelnes Objekt verkaufen, indem sie nur "LINKE VERBINDUNG" verwenden ... was den Datensatz nicht löscht, wenn kein zweites Element vorhanden ist. –

+0

@CanCeylan Wenn Sie Geschäfte benötigen, die keine Artikel verkaufen, dann fehlt eine Tabelle in Ihrer Frage ... –