MySQL: SELECT-Abfrage bei mehreren Werten in einer Spalte

Zvoni

Erfahrenes Mitglied
Dann brauchst Du eigentlich nur eine Spalte "unique" zu machen aber das wird bei der Tabelle teilnehmer nicht möglich sein, weil es keine Spalte gibt, wo jede ID nur einmal vorkommt. Bleibt nur die Möglichkeit, zusätzlich eine unique ID hinzu zu fügen.
Nicht ganz.
Man kann auch beide Spalten eID und pID gemeinsam als UNIQUE deklarieren (kombinierter Primary Key), welches sogar logisch ist:
Die Kombination aus Expedition und Teilnehmer kann ja tatsächlich nur einmal vorkommen.
Nur eID oder nur pID als UNIQUE geht nämlich nicht (wie schon geschrieben!).

Die "Krücken"-Lösung ist eine zusätzliche anonyme Spalte als Primärschlüssel zu deklarieren, was in meinen Augen Unsinn ist, weil (zumindest derzeit) die Tabelle Teilnehmer nicht als Master-Tabelle verwendet wird, welche unter Umständen auf eine Detail-Tabelle verzweigt (wie auch schon beschrieben)
 

Tuppie

Mitglied
So, jetzt habe ich die DB etwas nach Euren Anregungen entschlackt: keine Tabelle Jahr, keine Tabelle Leiter.
Stattdessen nach Zvonis Anregung eine Spalte Leiter in der Tabelle teilnehmer eingefügt und alle Teilnehmer, die bei einer Expedition die Leiterrolle inne haben, mit dem Wert 1 versehen.
Nun frage ich mich, wie ich mir für einen bestimmten Nachnamen alle Exp. ausgeben lassen kann, wo die Person mit entsprechendem Nachnamen Leiter war. Ich dachte, dass Folgendes zum Erfolg führt, tut es aber nicht:

SELECT
expedition.expeditionsname, expedition.eID, expedition.Leiter
FROM
expedition,personen,teilnehmer
WHERE
personen.Nachname='Herrligkoffer' AND
teilnehmer.pID=personen.pID AND
teilnehmer.Leiter=1

Diese konkrete Abfrage müsste nun zwei Treffer ausgeben, passiert aber nicht, ich bekomme deutlich mehr Ergebnisse. Dabei dachte ich, ich hätte eindeutig eingegrenzt!?
Was stimmt hier nicht oder fehlt gar noch?
 

Sempervivum

Erfahrenes Mitglied
Wenn ich das richtig sehe, fehlt da noch die Verknüpfung zur Expedition:
Code:
SELECT
    expedition.expeditionsname, expedition.eID
FROM
    expedition,personen,teilnehmer
WHERE
    personen.Nachname='Herrligkoffer' AND
    teilnehmer.pID=personen.pID AND
    teilnehmer.eID=expedition.eID AND -- dies fehlte
    teilnehmer.Leiter=1
Und wenn Du in der Tabelle expedition eine Spalte leiter hast, fährst Du zweigleisig: Wenn ich Zvonis Ansatz richtig verstehe ist diese Spalte überflüssig.

BTW: Super Hinweis von Zvoni, dass man auch zwei Spalten als unique definieren kann, funktioniert einwandfrei und hat einen doppelten Eintrag in meiner Tabelle teilnehmer aufgedeckt.
 

Zvoni

Erfahrenes Mitglied
Wenn ich das richtig sehe, fehlt da noch die Verknüpfung zur Expedition:
Code:
SELECT
    expedition.expeditionsname, expedition.eID
FROM
    expedition,personen,teilnehmer
WHERE
    personen.Nachname='Herrligkoffer' AND
    teilnehmer.pID=personen.pID AND
    teilnehmer.eID=expedition.eID AND -- dies fehlte
    teilnehmer.Leiter=1
Und wenn Du in der Tabelle expedition eine Spalte leiter hast, fährst Du zweigleisig: Wenn ich Zvonis Ansatz richtig verstehe ist diese Spalte überflüssig.

BTW: Super Hinweis von Zvoni, dass man auch zwei Spalten als unique definieren kann, funktioniert einwandfrei und hat einen doppelten Eintrag in meiner Tabelle teilnehmer aufgedeckt.
Korrekt. Spalte "Leiter" in expedition ist überflüssig.

Als generellen Tip an Tuppie:
Immer wenn du eine Abfrage über mehrere Tabellen generieren willst, kannst du wie folgt vorgehen:
Leeres Blatt Papier im Querformat vor dich legen
Was will ich? --> Expeditionsname --> Also ist Tabelle expedition die am weitesten links (hinschreiben)
Welche Kriterien habe ich? --> Die Teilnehmer ---> Tabelle Teilnehmer rechts von expedition
Was ist mein Filter für die Teilnehmer? --> Ein Personen-Name --> Tabelle personen rechts von Teilnehmer

So kannst du sehen, welche Verknüpfungen du benötigst:
expedition zu Teilnehmer
Teilnehmer zu person

Ein "WHERE Tabelle1.EinFeld=Tabelle2.EinFeld" ist eine Verknüpfung
Ein "WHERE Tabelle1.EinFeld=EinWert" Ist ein Filter
 

Tuppie

Mitglied
Korrekt. Spalte "Leiter" in expedition ist überflüssig.

Als generellen Tip an Tuppie:
Immer wenn du eine Abfrage über mehrere Tabellen generieren willst, kannst du wie folgt vorgehen:
Leeres Blatt Papier im Querformat vor dich legen
Was will ich? --> Expeditionsname --> Also ist Tabelle expedition die am weitesten links (hinschreiben)
Welche Kriterien habe ich? --> Die Teilnehmer ---> Tabelle Teilnehmer rechts von expedition
Was ist mein Filter für die Teilnehmer? --> Ein Personen-Name --> Tabelle personen rechts von Teilnehmer

So kannst du sehen, welche Verknüpfungen du benötigst:
expedition zu Teilnehmer
Teilnehmer zu person

Ein "WHERE Tabelle1.EinFeld=Tabelle2.EinFeld" ist eine Verknüpfung
Ein "WHERE Tabelle1.EinFeld=EinWert" Ist ein Filter
Ein dickes DANKE an zvoni und sempervivum für die Lösung des Problems und den guten Allgemeinhinweis von zvoni - das werde ich probieren!
Die Spalte Leiter in der Tabelle expeditionen ist tatsächlich hinfällig, ich hatte sie noch belassen, bis die Leiterabfrage klappt. Klappt ja nun! ;-)

Achja, das UNIQUE-setzen von eID und pID in teilnehmer hat geklappt, der Doppeleintrag ist beseitigt.
Hierzu: gibt es einen Befehl, der bei derartigen Mehrfacheinträgen alle Dubletten bis auf einen Eintrag (der soll ja vorhanden bleiben) rausschmeißt?
 

Zvoni

Erfahrenes Mitglied
Sowas brauchst du nur, wenn die Spalte( n) nicht UNIQUE sind.
Ich glaube mich daran zu erinnern, dass hier um DB-Forum es schon den ein oder anderen Lösungsansatz gab. Musst mal forschen.
 
Zuletzt bearbeitet:

Tuppie

Mitglied
Dank Eurer Hilfe gedeiht meine DB mehr und mehr.
Nun habe ich erstmals wieder ein Problem, wo ich nicht weiß, wie ich verfahren soll: ich habe in meiner Personenliste erstmalig zwei Personen mit identischem Vor- und Nachnamen, die aber nachweislich verschiedene Personen darstellen. Hat jemand eine Idee, wie man das unterscheidet?
Wenn ich jetzt eine Abfrage stelle "gib mir alle Expeditionen aus, an denen xy teilgenommen hat", dann gibt es momentan wegen dieser Dopplung natürlich falsche Ergebnisse.
 

Zvoni

Erfahrenes Mitglied
In einer reinen Anzeige, in welcher man nur über den Namen filtert?
Wüsste ich auch nicht.
zweimal Fritz Müller bleibt zweimal Fritz Müller (auch wenn es unterschiedliche Personen sind),
es sei denn du hast weitere Unterscheidungsmerkmale (Bsp. zweiter Vorname, Geburtstag oder Alter, aber auch das ist nicht wasserdicht).
 

Tuppie

Mitglied
In einer reinen Anzeige, in welcher man nur über den Namen filtert?
Wüsste ich auch nicht.
zweimal Fritz Müller bleibt zweimal Fritz Müller (auch wenn es unterschiedliche Personen sind),
es sei denn du hast weitere Unterscheidungsmerkmale (Bsp. zweiter Vorname, Geburtstag oder Alter, aber auch das ist nicht wasserdicht).
Ja richtig.
Dachte mir schon, dass es da keinen "Kniff" gibt, um das Problem(chen) zu lösen. Dann werde ich in den Expeditionseiten, also in die entsprechenden htm-Seiten, Hinweise geben, damit es keine Verwechslungen gibt. Derlei sollte die große Ausnahme bleiben...