Ergebnis sieben anhand erster Spalte? (verwirrend)

Hallo!

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.



Würde mich sehr über Hinweise freuen!

Du solltest dein Datenmodell normalisieren, dann löst sich dein Problem von selbst.

Hier ein kleiner Einstieg:
Normalisierung in Wikipedia

Auf Ratschlag von ads hier eine (hoffentlich richtig) normalisierte Version der Tabelle.


WORT_ID | WORT
1, blau
2, rot
3, gelb
4, grün
5, lila

ID, WORT_ID
1, 1
1,
2
1, 3
2, 4
2, 2
3, 2
3,
1
3, 5


Und nu? :smiley:

Skuriles DB-Schema, aber was solls:

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)

Andreas

Hallo Andreas, danke für den Beitrag:
select id from (select id,wort from tab1 where wort in (‘blau’, ‘rot’)) foo group by id having count(1) = 2;


Ich hatte gehofft es gäbe eine Lösung ohne COUNT() und dergleichen, weil man ja immer liest das sei so langsam.
:confused:

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.

Andreas