SQL-Abfrage: Einträge, die auf alle zutreffen

SQL-Abfrage: Einträge, die auf alle zutreffen

am 05.05.2006 07:54:12 von Andreas Muschkat

Ich weiß nicht, wie ich für folgendes Problem eine SQL-Abfrage
zusammenstellen muß:

Tabelle Gegenstaende (geg):
id: ID des Datensatzes
name: Name des Gegenstands , z.B. Ball, Stuhl, Tisch
preis: Preis des Gegenstands (integer)

Tabelle Eigenschaften (eig):
id: ID des Datensatzes
name: Name der Eigenschaft, z.B. rot, gruen, rund, leicht...

Tabelle Eigenschaften-Gegenstaende-Verknüpfung (geg_eig_verkn):
geg_id: ID des Gegenstandes
eig_id: ID der Eigenschaft
In dieser Tabelle ist pro Verknüpfung einer Eigenschaft mit einem
Gegenstand ein Eintrag.

Nun will ich alle Gegenstände habe, deren Eigenschaft "rund" ist (ID
ist hier z.B. 1)

Dazu dann folgender SQL-String:

SELECT gv.geg FROM geg_eig_verkn gv WHERE gv.eig_id=1

Das war noch einfach. Nun will ich alle haben, die rund oder leicht
sind (ID für leicht = 2).

SELECT gv.geg FROM geg_eig_verkn gv WHERE gv.eig_id=1 OR gv.eig_id=2

Nun aber die Fragen: Wie bekomme ich eine UND-Verknüpfung hin? Ich
will also alle Gegenstände haben, die rund UND leicht sind.

SELECT gv.geg FROM geg_eig_verkn gv WHERE gv.eig_id=1 AND gv.eig_id=2
geht natürlich nicht, weil eig_id schlecht 1 und gleichzeitig 2 sein
kann...

Mein endgültiges Ziel, also die eigentliche SQL-Frage, die ich suche,
ist: Ich will alle runden und leichten Gegenstände, die weniger als 10
EUR gekostet haben.

Die einfache Variante (alle runden Gegenstände, die weniger als 10 EUR
kosten) geht so:

SELECT g.id FROM geg g,geg_eig_verkn gv WHERE g.preis<10 AND
gv.eig_id=1 AND gv.geg_id=g.id

Wie bekomme ich hier die Abfrage mit "rund" und "leicht" hin?


Viele Grüße,
Andreas

Re: SQL-Abfrage: Einträge, die auf alle zutreffen

am 05.05.2006 13:28:29 von Hartmut Holzgraefe

Andreas Muschkat wrote:
[...]

> SELECT gv.geg FROM geg_eig_verkn gv WHERE gv.eig_id=3D1 OR gv.eig_id=3D=
2
>=20
> Nun aber die Fragen: Wie bekomme ich eine UND-Verknüpfung hin? Ich
> will also alle Gegenstände haben, die rund UND leicht sind.

ungetestet, sollte aber so tun:

SELECT gv.geg
, COUNT(*) AS anzahl
FROM geg_eig_verkn gv
WHERE gv.eig_id IN (1,2)
GROUP BY gv.eig_id
HAVING anzahl =3D 2;



--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

http://www.mysql.com/support/

Re: SQL-Abfrage: Einträge, die auf alle zutreffen

am 05.05.2006 15:55:46 von Andreas Muschkat

On Fri, 05 May 2006 13:28:29 +0200, Hartmut Holzgraefe
wrote:

>ungetestet, sollte aber so tun:

Danke, funktioniert! Gedanklich habe ich mir das so vorgestellt
(Anzahl zusammenzählen und überprüfen, ob das der Summe entspricht),
aber an den zu kennenden Möglichkeiten haperte es. :)

Andreas