MySQL: SELECT-Abfrage bei mehreren Werten in einer Spalte

Zvoni

Erfahrenes Mitglied
Ohweia, also: die pID=6 ist laut meiner Personenliste eine Person, die nichts mit der Expedition zu tun hat, die mir bei Deiner Abfrage

SELECT
expedition.eID, expedition.expeditionsname
FROM
expedition, personen
WHERE
personen.pID=6 AND
personen.pID=expedition.LID

ausgeworfen wird, nämlich die eID 7. Nimm es mir nicht übel, aber das verstehe ich nicht!?
Ah, OK. Habs gerade gesehen. Du hast Recht. Habe mich geirrt.
Du hast in der "Leiter"-Tabelle (die überflüssig ist), ein Feld "pID", welches der eigentliche Zeiger auf die Personen-Tabelle ist. Habs durcheinander gebracht.
Sempervivum hat Recht, dass du Redundanz in der Leiter-Tabelle hast (welche anderst ist als in deiner ersten Struktur).

Deine ursprüngliche Frage würde meine Lösung so aussehen:
SQL:
SELECT
expedition.expeditionsname, expedition.eID
FROM
expedition, teilnehmer, personen, leiter
WHERE
leiter.lID=expedition.lID AND
teilnehmer.eID=expedition.eID AND  //DAS HIER FEHLT!
teilnehmer.pID=personen.pID AND
leiter.pID=personen.pID AND
leiter.lID=6
 

Tuppie

Mitglied
Ich stimme Zvoni zu, auch meiner Meinung nach ist die Tabelle Leiter redundant, denn sie enthält Vorname und Nachname, ebenso wie die Tabelle Personen.

Mir scheint mit der vorhandenen Struktur machst Du es dir in #33 viel zu kompliziert. Für mich ergibt dies genau das richtige und nur das eine Resultat:
Code:
SELECT expedition.expeditionsname, expedition.eID FROM expedition, leiter
    WHERE leiter.lID=expedition.lID
        AND leiter.lID=6

Ebenso in #39, hier führt für mich dies zum Ziel:
Code:
SELECT
    expedition.expeditionsname, expedition.eID
FROM
    expedition,leiter
WHERE
    leiter.Nachname='Aufschnaiter' AND
    expedition.lID = leiter.lID

Und wenn man alle Teilnehmer dieser Expedition haben möchte:
Code:
SELECT
        expedition.expeditionsname, expedition.eID, personen.Vorname, personen.Nachname
FROM
        expedition, leiter, teilnehmer, personen
WHERE
        leiter.Nachname='Aufschnaiter' AND
        expedition.lID = leiter.lID AND
        personen.pID = teilnehmer.pID AND
        teilnehmer.eID = expedition.eID
DANKE Sempervivum für die genial einfache Lösung, auf die ich nicht gekommen wäre, weil ich viel zu kompliziert gedacht habe und nicht weiter kam...
Die Namensangaben in der Leitertabelle sind für mich nur eine Gedächtnisstütze, damit ich nicht den Überblick verliere ;-)
Grundsätzlich ist die Tabelle leiter nicht redundant (für mich), da ich keine andere Lösung sehe, Leiter abzufragen. In der Personentabelle ist ja diesbezüglich keine Info vermerkt!?
Oder ich füge in der Tabelle expedition eine Spalte "Leiter" statt lID ein und trage hier die Namen gleich ein. Würde aber zwei Spalten für Nach- und Vorname bedeuten.
Die Teilnehmerabfrage hatte ich mir auch schon so zurecht gebastelt, aber bei der Leiterabfrage hackelte es...
 

Tuppie

Mitglied
Ah, OK. Habs gerade gesehen. Du hast Recht. Habe mich geirrt.
Du hast in der "Leiter"-Tabelle (die überflüssig ist), ein Feld "pID", welches der eigentliche Zeiger auf die Personen-Tabelle ist. Habs durcheinander gebracht.
Sempervivum hat Recht, dass du Redundanz in der Leiter-Tabelle hast (welche anderst ist als in deiner ersten Struktur).

Deine ursprüngliche Frage würde meine Lösung so aussehen:
SQL:
SELECT
expedition.expeditionsname, expedition.eID
FROM
expedition, teilnehmer, personen, leiter
WHERE
leiter.lID=expedition.lID AND
teilnehmer.eID=expedition.eID AND  //DAS HIER FEHLT!
teilnehmer.pID=personen.pID AND
leiter.pID=personen.pID AND
leiter.lID=6
DANKE Zvoni für Deinen abermaligen Rat!
Wie ich Sempervivum schon geschrieben hatte: die Tabelle leiter ist nur deshalb nicht redundant für mich, weil ich keine andere Lösung sehe, einer Person aus der Tabelle personen diese Zusatzinformation aufzudrücken. Zwei zusätzliche Spalten "Vorname Leiter" und "Nachname Leiter" in der Tabelle expedition ist auch nicht besser, oder?
 

Sempervivum

Erfahrenes Mitglied
Grundsätzlich ist die Tabelle leiter nicht redundant (für mich), da ich keine andere Lösung sehe, Leiter abzufragen. In der Personentabelle ist ja diesbezüglich keine Info vermerkt!?
Das kann ich nicht nachvollziehen. In der Tabelle expedition hast Du doch die Leiter-ID und die kann problemlos auch auf eine Person in der Personentabelle verweisen. Dann hast Du auch Zugriff auf Vor- und Nachname ohne sie redundant in expedition zu führen. Der Leiter ist ja auch eine Person bzw. Teilnehmer an der Expedition.
In der Personentabelle ist ja diesbezüglich keine Info vermerkt!?
Ich dachte kurzzeitig daran, in der Personentabelle eine Kennung anzubringen, die angibt, ob es sich um einen Leiter handelt, aber das würde nicht passen, weil die selbe Person ja bei einer Exp. der Leiter sein kann, bei einer anderen aber nur Teilnehmer.
 

Tuppie

Mitglied
Das kann ich nicht nachvollziehen. In der Tabelle expedition hast Du doch die Leiter-ID und die kann problemlos auch auf eine Person in der Personentabelle verweisen. Dann hast Du auch Zugriff auf Vor- und Nachname ohne sie redundant in expedition zu führen. Der Leiter ist ja auch eine Person bzw. Teilnehmer an der Expedition.
Heißt, dass ich in der Personentabelle eine Spalte lID anlege und entsprechend fülle? Bei den meisten Personen bleibt das Feld dann frei, aber ist ja egal, oder?
Ich dachte kurzzeitig daran, in der Personentabelle eine Kennung anzubringen, die angibt, ob es sich um einen Leiter handelt, aber das würde nicht passen, weil die selbe Person ja bei einer Exp. der Leiter sein kann, bei einer anderen aber nur Teilnehmer.
Richtig! ;-)
 

Sempervivum

Erfahrenes Mitglied
Heißt, dass ich in der Personentabelle eine Spalte lID anlege und entsprechend fülle?
Auch hier kann ich dir nicht folgen. Wozu soll diese dienen, wenn es keine Tabelle leiter mehr gibt?
Beschreibe doch mal verbal eine Abfrage wo Du meinst, dass es nicht ohne die Leitertabelle geht.
Wenn Du eine Expedition hast, kannst Du über die Leiter-ID auf die Personentabelle zugreifen und Name und Vorname des Leiters lesen.
Und wenn Du Name und Vorname einer Person hast, kannst Du heraus finden, bei welchen Exp. sie Leiter war.
 

Tuppie

Mitglied
Auch hier kann ich dir nicht folgen. Wozu soll diese dienen, wenn es keine Tabelle leiter mehr gibt?
Beschreibe doch mal verbal eine Abfrage wo Du meinst, dass es nicht ohne die Leitertabelle geht.
Wenn Du eine Expedition hast, kannst Du über die Leiter-ID auf die Personentabelle zugreifen und Name und Vorname des Leiters lesen.
Und wenn Du Name und Vorname einer Person hast, kannst Du heraus finden, bei welchen Exp. sie Leiter war.
Entschuldige meine Nachfrage: heißt, dass ich letztlich die Spalte lID z.B. in "Leiter" (muss nicht) umbenenne und dort die pID der Perosn eintrage, die eben bei dieser Exp. Leiter war. Korrekt?
Den Namen kann man sich dann ja in der Tat auswerfen lassen.
Ich "fürchte", dass das klappt und ich mich fragen muss, warum ich so kompliziert gedacht habe...!?
 

Sempervivum

Erfahrenes Mitglied
heißt, dass ich letztlich die Spalte lID z.B. in "Leiter" (muss nicht) umbenenne und dort die pID der Perosn eintrage, die eben bei dieser Exp. Leiter war. Korrekt?
Ja, genau so stelle ich mir das vor und ich bin ziemlich sicher, dass man dann an alle Informationen heran kommt.
 

Zvoni

Erfahrenes Mitglied
Vielleicht zum besseren Verständnis, wie du dir die "Leiter"-Tabelle sparen kannst:
Du hast in Expedition ein Feld "pID" (anstatt "LID"), und dieses "pID" verweist DIREKT auf die "pID" in Personen, welche der Leiter ist.
Heisst aber auch: Jede Expedition kann auch nur einen Leiter haben (und nicht zwei oder mehr)
Code:
SELECT
expedition.expeditionsname, expedition.eID, personen.vorname, personen.nachname
FROM
expedition, teilnehmer, personen
WHERE
personen.pID=expedition.pID AND
teilnehmer.eID=expedition.eID AND
teilnehmer.pID=personen.pID AND
personen.pID=53

EDIT: Expedition.pID muss natürlich 53 sein (du hattest vorher LID=6 hier stehen)
 
Zuletzt bearbeitet:

Neue Beiträge