Ergebnis 1 bis 6 von 6

Thema: Ergebnis sieben anhand erster Spalte? (verwirrend)

  1. #1
    mikser ist offline Benutzer
    Registriert seit
    25.03.2008
    Beiträge
    30

    Frage 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!
    Geändert von mikser (27.03.2008 um 01:26 Uhr)

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    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

  3. #3
    mikser ist offline Benutzer
    Registriert seit
    25.03.2008
    Beiträge
    30

    Standard

    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?

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von mikser Beitrag anzeigen
    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!
    Skuriles DB-Schema, aber was solls:

    Code:
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    mikser ist offline Benutzer
    Registriert seit
    25.03.2008
    Beiträge
    30

    Standard

    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.


  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von mikser Beitrag anzeigen
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 11.01.2011, 10:53
  2. Ergebnis in seperate Spalte eintragen
    Von karl_ha im Forum SQL
    Antworten: 10
    Letzter Beitrag: 26.08.2010, 15:43
  3. Antworten: 13
    Letzter Beitrag: 15.07.2009, 08:51
  4. erster freier wert einer index-spalte
    Von marcomania im Forum SQL
    Antworten: 11
    Letzter Beitrag: 13.11.2006, 10:28
  5. erster login?
    Von gnoerz im Forum Sonstige Installationsprobleme
    Antworten: 5
    Letzter Beitrag: 12.04.2006, 21:56

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum