Impossible WHERE

Hallo zusammen!

Ich habe ein kleines Problem, komm aber nicht ganz dahinter.

Ich habe folgende Tabelle, in der Eigenschaftswerte eines Mediums abgespeichert werden. Die Medien an sich und die Eigenschaftsbezeichnungen sind in anderen Tabellen gespeichert. Hier sind nur die Verknüpfung und die echten Werte der Eigenschaften gespeichert:

Medium_id | Eigenschaft_id | Wert

1 | 1 | Java ist eine Insel

1 | 2 | Philipp Landmann

2 | 1 | Wer Weiss Was

2 | 2 | Hans Bär

Ich möchte nun die Medien-IDs, bei denen im Titel Java steht (Eigenschaft_id 1) und Landmann der Autor (Eigenschaft_id 2) ist.
Folgendes SQL-Statement funktioniert leider nicht.

SELECT mhe.Medium_id
FROM medium_has_eigenschaft AS mhe
WHERE (
mhe.eigenschaft_id =1
AND mhe.wert LIKE ‚%Java%‘
)
AND (
mhe.eigenschaft_id =2
AND mhe.wert LIKE ‚%Landmann%‘
)
LIMIT 0 , 4

Was stimmt daran nicht?

Vielen Dank vorarb für die Hilfe.

Hallo,

AND fordert ALLE Eigenschaften gleichzeitig, in Deinem Fall also MedienID = 1 und gleichzeitig 2. Du bekommst also nur dann, wenn 1=2 ist einen Wert.

DU brauchst lediglich das AND (Schön geklammert hast du ja schon) durch ein OR zu ersetzen. Dann sollte es laufen.

Gruß

Peter

Hallo zusammen!

Ich habe ein kleines Problem, komm aber nicht ganz dahinter.

Ich habe folgende Tabelle, in der Eigenschaftswerte eines
Mediums abgespeichert werden. Die Medien an sich und die
Eigenschaftsbezeichnungen sind in anderen Tabellen
gespeichert. Hier sind nur die Verknüpfung und die echten
Werte der Eigenschaften gespeichert:

Medium_id | Eigenschaft_id | Wert

1 | 1 | Java ist eine Insel

1 | 2 | Philipp Landmann

2 | 1 | Wer Weiss Was

2 | 2 | Hans Bär

Ich möchte nun die Medien-IDs, bei denen im Titel Java steht
(Eigenschaft_id 1) und Landmann der Autor (Eigenschaft_id 2)
ist.
Folgendes SQL-Statement funktioniert leider nicht.

SELECT mhe.Medium_id
FROM medium_has_eigenschaft AS mhe
WHERE (
mhe.eigenschaft_id =1
AND mhe.wert LIKE ‚%Java%‘
)

Das AND hier musst du gegen ein OR tauschen.

AND (
mhe.eigenschaft_id =2
AND mhe.wert LIKE ‚%Landmann%‘
)
LIMIT 0 , 4

Was stimmt daran nicht?

Vielen Dank vorarb für die Hilfe.

Vielen Dank für die Antwort.
Das ist einleutend. Aber wie bekomme ich es hin, dass beide Anforderungen gleichzeitig zutreffen, also dass ich nur die Medien bekomme, bei denen Java im Titel und Landmann als Autor steht.

Mit OR würde ich in diesem Fall ja die Medien 1 und 2 bekommen. Wenn beide Bedingungen wie gewünscht zutreffen, würde nur Medium 1 rauskommen?

Medium_id | Eigenschaft_id | Wert

1 | 1 | Java ist eine Insel

1 | 2 | Philipp Landmann

2 | 1 | Java für Anfänger

2 | 2 | Hans Bär

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

jetzt habe ich dein Datenmodell verstanden.

SELECT medium_id FROM medium_hat_eigenschaft mhe
WHERE EXISTS
(SELECT * FROM medium_hat_eigenschaft mhe2 WHERE mhe.medium_id = mhe2.medium_id)
AND EXISTS (
(SELECT * FROM medium_hat_eigenschaft mhe3 WHERE mhe.medium_id = mhe3.medium_id);

Wenn die DB das mitmacht, sollte das Ergebnis passen.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]