Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Abfrage mit AND

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von craven, 13 November 2013.

  1. craven

    craven Benutzer

    Hallo alle!
    ich habe ein Anliegen bezüglich einer Abfrage. Und zwar habe ich eine Tabelle mit den Spalten 'Kind' und 'Spielzeug'. Folgende Tupel sind gegeben:

    Max nintendo
    Max lego
    Max puzzel
    Fritz sega
    Fritz lego
    Moritz puzzel
    Moritz nintendo

    Wie kann ich nun eine Anfrage formulieren, wo mir alle Kinder ausgegeben werden, die sowohl nintendo als auch lego mögen? Ich habe den Kardinalsfehler begangen und es so formuliert:

    SELECT Kind
    FROM Tabelle
    WHERE Spielzeug = 'nintendo'
    AND Spielzeug = 'lego';

    Aber genau das kann ja nicht funktionieren, da das eine und selbe Tupel nicht beides erfüllt. Wie formuliert man das denn richtig in SQL?

    mfg,
    craven
     
  2. ukulele

    ukulele Datenbank-Guru

    Viele Möglichkeiten, das hier sollte deinen Bedarf am ehesten gerecht werden:
    Code:
    SELECT    DISTINCT Kind
    FROM    Tabelle
    WHERE    Spielzeug = 'nintendo'
    OR        Spielzeug = 'lego';
     
  3. craven

    craven Benutzer

    Besten Dank für die schnelle Antwort! Bei dieser Abfrage bekomme ich als Ausgabe dann Max einmal heraus (was richtig ist!), aber auch Fritz und Moritz. Dabei sollte eigentlich nur Max herauskommen. Was müsste ich zu der Abfrage hinzufügen, damit überprüft wird, ob es ein anderes Tupel desselben Kindes gibt, dass eben das entsprechende Spielzeugt mag? In diesem Fall müssen 2 Tupel übereinstimmen, damit ein Kind als Resultat angezeigt wird. Jedoch soll ein Kind, das nur eins dieser Spielzeuge mag, nicht angezeigt werden. Ich habe OR durch AND ersetzt, aber dann wurde mir gar nichts angezeigt... ich komme an dieser Stelle leider nicht weiter...
     
  4. ukulele

    ukulele Datenbank-Guru

    Sry, mein Fehler
    Code:
    SELECT    Kind
    FROM    Tabelle
    WHERE    Kind IN (    SELECT    Kind
                        FROM    Tabelle
                        WHERE    Spielzeug = 'nintendo' )
    AND        Kind IN (    SELECT    Kind
                        FROM    Tabelle
                        WHERE    Spielzeug = 'lego' )
     
    craven gefällt das.
  5. akretschmer

    akretschmer Datenbank-Guru

    Nett. Hat natürlich den Nachteil, daß bei Suche nach 3 Spielzeugen das SQL zu ändern ist.

    Ich biete:

    Code:
    test=*> select * from craven ;
      kind  | spielzeug
    --------+-----------
    max    | nintendo
    max    | puzzel
    max    | lego
    fritz  | sega
    fritz  | lego
    moritz | puzzel
    moritz | nintendo
    (7 rows)
    
    test=*> select * from (select kind, array_agg(spielzeug) as liste from craven group by kind ) foo where liste @> array['nintendo', 'lego'];
    kind |        liste
    ------+------------------------
    max  | {lego,nintendo,puzzel}
    (1 row)
    
    Das hat aber den Nachteil, daß es unter MySQL so direkt nicht läuft. Vielleicht mit group_concat aber anpassbar...
     
    craven gefällt das.
  6. ukulele

    ukulele Datenbank-Guru

    Kreativität kennt da keine Grenzen...
    Code:
    SELECT    Kind
    FROM    Tabelle
    WHERE    Spielzeug IN ( 'nintendo','lego' )
    GROUP BY Kind
    HAVING count(*) = 2
     
    akretschmer und craven gefällt das.
  7. craven

    craven Benutzer

    Vielen Dank für die Unterstützung... nun hat der Code wunderbar funktioniert! Manchmal muss man bei den Formulierungen um ein paar Ecken denken...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden