Abfrage mit AND

craven

Benutzer
Beiträge
5
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
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.394
Viele Möglichkeiten, das hier sollte deinen Bedarf am ehesten gerecht werden:
Code:
SELECT    DISTINCT Kind
FROM    Tabelle
WHERE    Spielzeug = 'nintendo'
OR        Spielzeug = 'lego';
 

craven

Benutzer
Beiträge
5
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...
 

ukulele

Datenbank-Guru
Beiträge
4.394
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' )
 

akretschmer

Datenbank-Guru
Beiträge
9.028
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' )

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...
 
Werbung:

craven

Benutzer
Beiträge
5
Vielen Dank für die Unterstützung... nun hat der Code wunderbar funktioniert! Manchmal muss man bei den Formulierungen um ein paar Ecken denken...
 
Oben