Du solltest dein Datenmodell normalisieren, dann löst sich dein Problem von selbst.
Hier ein kleiner Einstieg:
Normalisierung in Wikipedia
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!
Geändert von mikser (27.03.2008 um 01:26 Uhr)
Du solltest dein Datenmodell normalisieren, dann löst sich dein Problem von selbst.
Hier ein kleiner Einstieg:
Normalisierung in Wikipedia
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
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?![]()
Skuriles DB-Schema, aber was solls:
AndreasCode: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)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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.
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen