Moin Moin !
SELECT
id,COUNT(*) AS n
FROM
tabelle
WHERE
farbe='rot' OR farbe='blau'
GROUP BY
id,farbe
HAVING
n > 1 <---- evtl. auch COUNT(*) statt nUnd so sollte es mit mehreren identischen Paaren auch noch funktionieren.
Du hast natürlich recht mit dem Zeilenweise arbeiten.
allerdings verstehe ich hierbei die letzte Klausel mit dem Having nicht wirklich. Erklär mir es mal bitte!
Erstmal: das GROUP BY muß nur "id" heißen, nicht "id,farbe", sonst geht's doch nicht. :-(
----+----------
id | farbe
----+----------
12 | rot
15 | rot
12 | blau
13 | blau
15 | grün
HAVING funktioniert wie WHERE, nur ist HAVING von der (normalerweise stattfindenden) Query-Optimierung ausgenommen und filtert erst unmittelbar vor der Rückgabe des Ergebnisses.
Das ganze Statement gruppiert [ GROUP BY ] erstmal nach "id", zählt [ COUNT(*) ] für jede id die Zeilen der Gruppe, und das alles nur für Zeilen, die rot oder blau sind. Ohne das having bekommst Du also sowas:
id | n
---+---
12 | 2 <-- je eine rot und blau
15 | 1 <-- nur die rote zählt, die grüne hat WHERE rausgeworfen
13 | 1 <-- eine blaue
Und HAVING sucht jetzt alle, die mehr als eine Zeile (n>1) haben.
id | n
---+---
12 | 2
q.e.d.
Auf die Nase fällt das ganze, wenn in der Original-Tabelle Paare doppelt vorkommen, weil die bei COUNT(*) eben auch doppelt zählen.
Verstanden ?
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"