Ich komme hier leider nicht weiter, obwohl es vermutlich einfaches SQL Einmaleins ist:
Habe eine Tabelle mit den Spalten ID und WORTE:
CREATE TABLE wortliste (id integer, worte text)
Die ist so gefüllt:
ID, WORTE 1, blau
1,rot
1, gelb
2, grün
2, rot
3, rot
3,blau
3, lila
4, …
5, …
Nun gebe ich mal die Wörter “blau” und “rot” vor und möchte als Ergebnis die IDs “1” und “3” bekommen (weil nur jeweils dort sowohl rot als auch blau vorkommen). Beim Suchwort “grün” würde ich hier nur ID “2” bekommen usw. Wie macht man das am schlausten? Die echte Tabelle hat übrigens sehr viele Zeilen. Ich versuche mich schon die ganze Zeit daran, eine Idee beinhaltete DISTINCT, hat aber letzendlich auch nicht funktioniert. ARGH.
test=*# select * from farben ;
id | f
----+------
1 | blau
1 | rot
1 | gelb
2 | grün
2 | rot
3 | rot
3 | blau
3 | lila
4 | ...
5 | ...
(10 rows)
test=*# select id from (select id, f from farben where f in ('blau', 'rot')) foo group by id having count(1) = 2;
id
----
3
1
(2 rows)
Kommt drauf an. Ein count(*) from table; ist vergleichsweise lahm, weil es einen seq. Scan bedingt. In Deinem Fall gibt es ein WHERE, welches ja möglicherweise sehr selektiv ist, die Aggregation dann ist vergleichsweise billig. Man müßte sich halt mal ein reales ‘explain analyse …’ anschauen.