MySQL: SELECT-Abfrage bei mehreren Werten in einer Spalte

Tuppie

Mitglied
Du musst teilnehmer.eID=expedition.eID und Teilnehmer.pID=person.pID vergleichen
Ich danke Dir für den Hinweis, das hat den gewünschten Erfolg gebracht!
Jetzt habe ich mal eine funktionierende Abfrage über mehrere Tabellen hinweg und hoffe, dass mir das hilft, den Syntax als SQL-Neuling besser zu durchschauen!
 

Tuppie

Mitglied
Zunächst danke für die zurückliegenden, guten Hinweise, die es mir ermöglichen, an meiner DB zu arbeiten. Nun stoße ich auf ein Problem und finde keine Erklärung: ich habe eine Abfrage geschrieben, mit der man sich die Expeditionen anzeigen lassen kann, die ein bestimmter Leiter (bei mir über die Tabelle "Leiter" und eine entsprechende Leiter-ID lID zugeordnet) abfragen kann:

SELECT
expedition.expeditionsname, expedition.eID
FROM
expedition, teilnehmer, personen, leiter
WHERE
leiter.lID=expedition.lID AND
teilnehmer.pID=personen.pID AND
leiter.lID=personen.pID AND
leiter.lID=6

Bei lID=6 zeigt sich das Problem: eine kleine Expedition, nur zwei Teilnehmer, als Abfrageresultat bekomme ich die korrekte Exp. ausgegeben, aber gleich 2x. Warum?
Die beiden Teilnehmer tauchen in der Personentabelle nicht doppelt auf und auch in der Leiter-Tabelle gibt es keinen Doppelteintrag. Was übersehe ich? Bei anderen Exp. wird korrekt jede Exp. nur 1x ausgegeben, z.B. wenn man auf lID=6 prüft: zwei Exp., aber eben jeder Eintrag nur 1x.
Anbei die DB "als zip", bitte die Dateiendung nur gegen sql tauschen, wer sich das näher anschauen möchte.
Ich danke sehr für Eure aufmerksamen Hinweise!!!
 

Anhänge

  • expeditionen.zip
    13,2 KB · Aufrufe: 4

Zvoni

Erfahrenes Mitglied
Wenn du eine "LID" in Expedition hast, brauchst du keine "Leiter"-Tabelle

SQL:
SELECT
expedition.expeditionsname, expedition.eID
FROM
expedition, teilnehmer, personen
WHERE
personen.pID=expedition.lID AND
teilnehmer.eID=expedition.eID AND  //DAS HIER FEHLT!
teilnehmer.pID=personen.pID AND
expedition.lID=6

Was mir aufgefallen ist: Bei eID=7 fehlt der Leiter (lID=6) in der Teilnehmer-Tabelle.
Und die Tabelle "Jahr" brauchst du auch nicht, da das Jahr direkt in Expedition steht

EDIT: Eine Tabelle "Leiter" brauchst du nur, falls es zwei oder mehr Leiter (Aus dem Kreis der Teilnehmer) pro Expedition gibt. In dem Fall darf es kein "LID" in Expedition geben!
 
Zuletzt bearbeitet:

Tuppie

Mitglied
Wenn du eine "LID" in Expedition hast, brauchst du keine "Leiter"-Tabelle

Was mir aufgefallen ist: Bei eID=7 fehlt der Leiter (lID=6) in der Teilnehmer-Tabelle.
Und die Tabelle "Jahr" brauchst du auch nicht, da das Jahr direkt in Expedition steht

EDIT: Eine Tabelle "Leiter" brauchst du nur, falls es zwei oder mehr Leiter (Aus dem Kreis der Teilnehmer) pro Expedition gibt. In dem Fall darf es kein "LID" in Expedition geben!
Grüß Dich Zvoni,
danke Dir sehr für Deine abermalige Unterstützung.

Zum Verständnis: warum keine Leiter-Tabelle? Jede Exp. hat einen Leiter. Diese Person ist mit einer pID in der Personentabelle und wird in der Teilnehmertabelle einer Exp. oder mehreren Exp. zugeordnet. Wenn ich in der expedition-Tabelle einen Leiter per lID ausweise, dann muss ich doch über eine weitere Zuordnung sagen, welche pID welchem Leiter entspricht oder? Wie soll ich das sonst regeln?

Zur eID=7: die Exp. besteht aus nur zwei Personen, sie sind mit pID=53 und pID=54 in der Personentabelle, beide sind entsprechend in der Teilnehmertabelle der Exp.ID 7 zugeordnet. Und pID=53 ist als Leiter der Exp. mit einer lID=6 versehen, die ja auch in der expedition-Tabelle entsprechend auftaucht.
Ich bin nach wie vor ratlos, wo der Fehler ist bzw. wie Dein Hinweis "Bei eID=7 fehlt der Leiter (lID=6) in der Teilnehmer-Tabelle" gemeint ist.

Die Jahr-Tabelle kann weg, das sehe ich ein. Habe ich nur als Altlast weitergeführt, sollte ich rausschmeißen...

Update: Deine Abfrage bringt mit lID=6 tatsächlich keinen Treffer, bei lID=5 aber auch nicht... :(
Wenn ich hingegen Deine zusätzliche Abfrage-Zeile weglasse, dann bekomme ich z.B. bei einer Abfrage nach lID=5 korrekte Ergebnisse. Ich bin ratlos!

Update: bei Abfrage so wie von mir gedacht bekomme ich z.B. bei Abfrage nach lID=1 ein Ergebnis - korrekt! Bei Abfrage nach lID=2 bekomme ich zwar das richtige Ergebnis, diesen Datensatz aber gleich doppelt angezeigt. Dieses Problem taucht mehrfach auf, so eben auch bei lID=7 (zwei korrekte Werte doppelt ausgegeben macht vier Datensätze im Abfrageergebnis...
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Aber personen.pID=53 ist ja nicht der Leiter für eID=7
In deiner ursprünglichen Abfrage im WHERE (gekürzt)
leiter.lID=expedition.lID AND
leiter.lID=personen.pID AND
leiter.lID=6
Du setzt Leiter.lID auf 6 und verberbst die "6" an personen.pID (also person mit pID=6 ist der Leiter und nicht pID=53
 

Zvoni

Erfahrenes Mitglied
Zum Verständnis: warum keine Leiter-Tabelle? Jede Exp. hat einen Leiter. Diese Person ist mit einer pID in der Personentabelle und wird in der Teilnehmertabelle einer Exp. oder mehreren Exp. zugeordnet. Wenn ich in der expedition-Tabelle einen Leiter per lID ausweise, dann muss ich doch über eine weitere Zuordnung sagen, welche pID welchem Leiter entspricht oder? Wie soll ich das sonst regeln?
Ich versuch es mal so rum: Vergiss mal alle anderen Tabellen ausser Expedition und Personen.
In Expedition hat du eine "LID" welche auf eine "pID" von Personen weist.
Zeige mir alle Expeditionen, bei welchen pID=6 der Leiter war
SELECT
expedition.eID, expedition.expeditionsname
FROM
expedition, personen
WHERE
personen.pID=6 AND
personen.pID=expedition.LID

Das würde dir alle expeditionen anzeigen, bei welchen pID=6 der Leiter war
Da du jetzt aber auch noch Teilnehmer hast, musst du Teilnehmer.eID mit expedition.eID vergleichen (woher soll das System wissen, welche Teilnehmer bei welcher Expedition waren?)
Man kann sich jetzt streiten, ob der Leiter auch in der Teilnehmer-Tabelle sein muss (muss er nämlich nicht!)

pID - Name
6 - Zvoni
7 - Tuppi
8 - Yaslaw

LID in expedition hat die 6
Teilnehmer sind aber wie folgt
eID - pID
7 - 7
7 - 8
 

Tuppie

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!?

Update:
An sich dachte ich, dass folgende Abfrage bei Eingabe eines Leiter-Nachnamens zum Erfolg führt:

SELECT
expedition.expeditionsname, expedition.eID
FROM
expedition, teilnehmer, personen
WHERE
personen.Nachname='Aufschnaiter' AND
teilnehmer.eID=expedition.eID AND
teilnehmer.pID=personen.pID AND
leiter.nachname= personen.Nachname

Klappt aber nicht, auch hier ist mir nicht klar, wieso nicht!?
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes 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