Abfrage über 3 Tabellen

jackiely

Grünschnabel
Sorry habe das Datenbanksystem vergessen: MySQL!

Hallo,

ich bin dabei ein Frontend für ein bestehendes Bibliothekssystem zu entwickeln.

Mein Problem betrifft 3 Tabellen, die alle über eine id miteinander verknüpft sind.

1. Tabelle "bestand"
bibid
autor
titel
... weitere Felder

2. Tabelle "status"
id
bibid
ausleihstatus (da oder nicht da)
ausleihtermin
rückgabetermin

3. Tabelle "optional"
oid
bibid
key_option_data
text_option_data

In der ersten Tabelle werden die bei der Katalogisierung erforderlichen
Pflichtfelder erfasst.

Die zweite Tabelle speichert alle statusrelevanten Daten.

In der dritten Tabelle wurden bei der Katalogiserung optionale Angaben
gespeichert. Beispielsweise Daten wie Erscheinungsjahr, Schlagwörter oder ob ein Bild
zur Ansicht zur Verfügung steht.

"Problem" hierbei, dass diesen Daten bei Katalogisierung ein sog. "key"
vergeben wurde, der in der Spalte key_option_data abgelegt wurde.
Im Feld text_option_data wird dann der reine Text abgespeichert.

Also ist ein Bild vorhanden steht im Feld key_option_data ein x und im Feld
text_option_data der Dateiname bild.jpg.
Wurde für das gleiche Buch auch ein Schlagwort vergeben, wurde der Schlüssel
y vergeben und im Feld text_option_data dann "programmierung".

Ich möchte nun erreichen, dass der Benutzer nach Suche über ein Formular Titel, Autor,
Ausleihstatus, aber auch angezeigt bekommt, ob ein Bild vorhanden ist, wenn ja, soll das Bild
angezeigt werden, wenn nein, entsprechende Ausgabe.

Leider bekomme ich es nicht hin, dass bei der SELECT-Abfrage, jene Datensätze
aus der Tabelle "optional" übersprungen werden, in denen der key_option_data nicht
mit dem Schlüssel für Buch versehen ist.

Letzter Versuch war:

$query = mysql_query("SELECT bestand.titel, "
. "bestand.autor, "
. "status.ausleihstatus, "
. "optional.text_option_data "
. "FROM biblio "
. "LEFT JOIN status "
. "ON bestand.bibid = status.bibid "
. "LEFT JOIN optional "
. "ON bestand.bibid = optional.bibid "
. "WHERE ((titel LIKE "
. "'%".$_REQUEST['title']."%') AND "
. "(key_option_data = x)) OR "
. "((titel LIKE "
. "'%".$_REQUEST['title']."%') OR "
. "(autor LIKE "
. "'%".$_REQUEST['title']."%'))");

Problem ist, dass ich dann natürlich doppelte Ausgaben bekomme,
verwende ich aber nur AND, erhalte ich nur die Daten,
die ein Bild haben.

Wie kann ich es erreichen, dass quasi Datensätze aus
optional übersprungen werden, die im Feld key_option_da nicht den
Schlüssel für Buch haben?

Ich wäre für Hilfe wirklich sehr dankbar!

Liebe Grüße

Jackie
 
Zuletzt bearbeitet:
Ich hoffe ich versteh die Situation richtig...

Wenn der Title z.B. foo ist.. und es z.B...
1. Datensatz
title= "foo"
key_option_data = x

2. Datensatz
title="keine ahnung"
autor="foo"
key_option_data = y

dann erhälst du beide Datensätze...

wen du aber die mit key_option_data!=x nur haben willst, egal ob nach autor oder title gesucht wird dann musst du in der where bedingung...

((titel LIKE '%".$_REQUEST['title']."%') AND (key_option_data = x)) OR
((autor LIKE '%".$_REQUEST['title']."%' AND (key_option_data = x)))

machen somit sollt er die titel & autor durchgehen und nur die bücher selecten..

hoffe ich konnt dir helfen und hab die situation verstanden, ist etwas früh ;)
 
Hallo, lieber Striker,

erstmal sorry, dass ich mich so spät erst melde, habe etwas gekränkelt.
Und vielen Dank für deine Antwort.

Allerdings ist das "Problem" anders gelagert, ist auch schwierig, das so zu beschreiben.

Es geht mir darum, dass die katalogisierten Bücher nicht zwangsläufig einen Eintrag in der Tabelle "optional" haben, aber halt auf jeden Fall in der Tabelle "bestand" und "status".

In Prosa formuliert möchte ich die Anfrage so gestalten:

Gib mir aus der Tabelle "bestand" den Autor und Titel, der so ähnlich wie der Suchbegriff ist,
gib mir außerdem aus der Tabelle "status" den Ausleihstatus, such außerdem in der Tabelle "optional", ob es dort einen Datensatz mit dem key_option_data x für Buch gibt.
Wenn es dort einen Eintrag gibt, dann gib mir den Klartext aus dem Feld text_option_data (beispielsweise bild.jpg).
Wenn dort kein Eintrag vorhanden ist, dann gib mir ein Null zurück oder so ähnlich.

Ist das einigermaßen verständlich?

Bisher ist es halt so, dass er mir garkeinen Satz zurück gibt, wenn er auch kein Bild findet.

Ich will ja aber, dass trotzdem der Bestand angezeigt wird, aber mir die Abfrage zurückwirft, dass eben kein oder ein Bild da ist.

Grüße

Jackie
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück