MySQL: SELECT-Abfrage bei mehreren Werten in einer Spalte

Tuppie

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)
Danke Zvoni, genau. Irgendwie hatte ich diese einfachere und logische Lösung nicht auf dem Schirm. Zwei Leiter sind ab und an vorhanden, üblicherweise gibt es aber einen Namen, der da Vorrang hat. Mit den wenigen Ausnahmen muss ich mich dann arrangieren, wenn man dafür eine übersichtlichere Struktur haben kann.
 

Zvoni

Erfahrenes Mitglied
Gibt es auch eine einfache Lösung dafür:
nennt sich m:n Beziehung

kann ich dir am Montag helfen
 

Zvoni

Erfahrenes Mitglied
Guten Morgen.
Also, zum Szenario "Expedition kann mehr als einen Leiter haben" ist wie gesagt eine klassische "m:n"-Beziehung. Allein um jetzt bei dir dieses Szenario zu implementieren wüsste ich zwei Vorgehensweisen.

Beide Varianten haben gemeinsam, dass es in Tabelle "Expedition" KEIN Feld "LID" bzw. pID" gibt, welches direkt auf einen Personensatz zeigt!!!!!

Variante 1)
In Tabelle "Teilnehmer" fügst du eine zusätzliche Spalte ein (Bsp. "Leiter"). Für diese Spalte benutzt du einen INTEGER-Datentyp (SmallINT, TinyInt, was auch immer) mit DEFAULT=0.
Die "0" bezeichnet einen Teilnehmer als normalen Teilnehmer, alles grösser 0 ist ein Leiter.
Ob du jetzt pauschal sagst, Leiter=1 ist ein Leiter, oder ob du eine Leiter-Hierarchie haben willst, ist dir überlassen.
Bsp. Zvoni hat Leiter=0, Fritz Müller hat Leiter=1, Hans Wurst hat Leiter=2
würde hier bedeuten:
Zvoni ist normaler Teilenehmer
Fritz Müller ist ein Leiter
Hans Wurst ist der Hauptleiter (weil er den höchsten Wert hat)
Eine Abfrage wie "Zeige mir für Expedition eID=17 alle Teilnehmer an, Die Leiter sollen als erstes hierarchisch ausgewiesen werden" könnte so aussehen:
SQL:
SELECT
personen.vorname, personen.nachname
FROM
expedition, personen, teilnehmer
WHERE
teilnehmer.eid=expedition.eid AND
personen.pid=teilnehmer.pid AND
expedition.eid=17

ORDER BY
teilnehmer.Leiter DESC,
personen.nachname,
personen.vorname
Eine Abfrage "Zeige mir die Leiter für Expedtion eID=17" könnte so aussehen (Die Abfrage ist diesselbe wie oben drüber zzgl. des zusätzlichen Filters.
SQL:
SELECT
personen.vorname, personen.nachname
FROM
expedition, personen, teilnehmer
WHERE
teilnehmer.eid=expedition.eid AND
personen.pid=teilnehmer.pid AND
expedition.eid=17 AND
teilnehmer.leiter>0

Variante 2)
Hinweis: Diese Variante nenne ich nur der Vollständigkeit halber!
Eine Zusätzliche Tabelle "Leiter" (Da haben wir die Tabelle wieder) mit folgenden Feldern:
eID --> Zeiger auf die Expedition
pID --> Zeiger auf die Person, welche Leiter ist
In dieser Variante brauchst du in Tabelle "Teilnehmer" KEINE zusätzliche Spalte (wie oben)
In dieser Konfiguration hast du aber wieder das Thema: Steht hier eine pID drin, ist es "ein" Leiter --> Keine Hierarchie! Willst du in dieser Variante eine Hierarchie haben, brauchst du auch hier eine zusätzliche Spalte "Hauptleiter" (oder ähnlich). Wieder mit Datentyp INTEGER.
Ob du hier die "0" als Hauptleiter machst, und alle mit einer "1" Nebenleiter sind, ist dir überlassen.
Die Abfragen sind aber um einiges komplizierter (Hier würde es dann losgehen mit UNION SELECT usw.)
Ich empfehle in deinem Fall eh Variante 1, weil man sich eine Tabelle sparen kann.
Desweiteren kannst du in die Situation kommen, dass z.B. Fritz Müller in Expedition 5 ein normaler Teilnehmer war, in Expedition 8 ist er ein Leiter, in Expedition 17 ist er Hauptleiter.
Ist mit Variante 1 deutlich einfacher zu handhaben.
 

Tuppie

Mitglied
Guten Morgen.
Also, zum Szenario "Expedition kann mehr als einen Leiter haben" ist wie gesagt eine klassische "m:n"-Beziehung. Allein um jetzt bei dir dieses Szenario zu implementieren wüsste ich zwei Vorgehensweisen.

Beide Varianten haben gemeinsam, dass es in Tabelle "Expedition" KEIN Feld "LID" bzw. pID" gibt, welches direkt auf einen Personensatz zeigt!!!!!

Variante 1)
In Tabelle "Teilnehmer" fügst du eine zusätzliche Spalte ein (Bsp. "Leiter"). Für diese Spalte benutzt du einen INTEGER-Datentyp (SmallINT, TinyInt, was auch immer) mit DEFAULT=0.
Die "0" bezeichnet einen Teilnehmer als normalen Teilnehmer, alles grösser 0 ist ein Leiter.
Ob du jetzt pauschal sagst, Leiter=1 ist ein Leiter, oder ob du eine Leiter-Hierarchie haben willst, ist dir überlassen.
Bsp. Zvoni hat Leiter=0, Fritz Müller hat Leiter=1, Hans Wurst hat Leiter=2
würde hier bedeuten:
Zvoni ist normaler Teilenehmer
Fritz Müller ist ein Leiter
Hans Wurst ist der Hauptleiter (weil er den höchsten Wert hat)
Eine Abfrage wie "Zeige mir für Expedition eID=17 alle Teilnehmer an, Die Leiter sollen als erstes hierarchisch ausgewiesen werden" könnte so aussehen:
SQL:
SELECT
personen.vorname, personen.nachname
FROM
expedition, personen, teilnehmer
WHERE
teilnehmer.eid=expedition.eid AND
personen.pid=teilnehmer.pid AND
expedition.eid=17

ORDER BY
teilnehmer.Leiter DESC,
personen.nachname,
personen.vorname
Eine Abfrage "Zeige mir die Leiter für Expedtion eID=17" könnte so aussehen (Die Abfrage ist diesselbe wie oben drüber zzgl. des zusätzlichen Filters.
SQL:
SELECT
personen.vorname, personen.nachname
FROM
expedition, personen, teilnehmer
WHERE
teilnehmer.eid=expedition.eid AND
personen.pid=teilnehmer.pid AND
expedition.eid=17 AND
teilnehmer.leiter>0

Variante 2)
Hinweis: Diese Variante nenne ich nur der Vollständigkeit halber!
Eine Zusätzliche Tabelle "Leiter" (Da haben wir die Tabelle wieder) mit folgenden Feldern:
eID --> Zeiger auf die Expedition
pID --> Zeiger auf die Person, welche Leiter ist
In dieser Variante brauchst du in Tabelle "Teilnehmer" KEINE zusätzliche Spalte (wie oben)
In dieser Konfiguration hast du aber wieder das Thema: Steht hier eine pID drin, ist es "ein" Leiter --> Keine Hierarchie! Willst du in dieser Variante eine Hierarchie haben, brauchst du auch hier eine zusätzliche Spalte "Hauptleiter" (oder ähnlich). Wieder mit Datentyp INTEGER.
Ob du hier die "0" als Hauptleiter machst, und alle mit einer "1" Nebenleiter sind, ist dir überlassen.
Die Abfragen sind aber um einiges komplizierter (Hier würde es dann losgehen mit UNION SELECT usw.)
Ich empfehle in deinem Fall eh Variante 1, weil man sich eine Tabelle sparen kann.
Desweiteren kannst du in die Situation kommen, dass z.B. Fritz Müller in Expedition 5 ein normaler Teilnehmer war, in Expedition 8 ist er ein Leiter, in Expedition 17 ist er Hauptleiter.
Ist mit Variante 1 deutlich einfacher zu handhaben.
Lieber zvoni,
ganz ganz herzlichen Dank, dass Du Dich tatsächlich dieser sehr speziellen Frage nochmals angenommen hast. Die Idee ist super und einfach umzusetzen, da ich derzeit erst knapp 30 Exp. in der DB habe. Zuerst wollte ich sehen, dass der Aufbau passt. So kann ich tatsächlich der Tatsache gerecht werden , dass es ab und an mehrere Leiter gibt, zumeist als "Hauptleiter" und "stellvertretender Leiter" angegeben. Probiere ich direkt mal an einer Stichprobe aus und berichte Dir morgen...
DANKE!
 

Tuppie

Mitglied
Desweiteren kannst du in die Situation kommen, dass z.B. Fritz Müller in Expedition 5 ein normaler Teilnehmer war, in Expedition 8 ist er ein Leiter, in Expedition 17 ist er Hauptleiter.
Ist mit Variante 1 deutlich einfacher zu handhaben.
Dieser Fall kommt übrigens recht häufig vor: ein Alpinist ist ja nie ausschließlich als Teilnehmer oder nur als Leiter unterwegs gewesen!
 

Zvoni

Erfahrenes Mitglied
Ich habe die Tests mit eID=17 gemacht (4 Teilnehmer)
Geh mal auf Teilnehmer und filter nach eID=17, füge die Spalte hinzu, setz bei zweien die 0, bei den anderen eine 1 und eine 2.
 

Tuppie

Mitglied
Ich habe die Tests mit eID=17 gemacht (4 Teilnehmer)
Geh mal auf Teilnehmer und filter nach eID=17, füge die Spalte hinzu, setz bei zweien die 0, bei den anderen eine 1 und eine 2.
Ist schon sehr, sehr schön, wenn etwas klappt!!!
Ich DANKE Dir sehr für Deine Hilfe, bis ich mich revanchieren kann wird es noch 1001 Abfrage dauern ;-)

Eine Frage habe ich dennoch: in manchen Spalten kann ich Inhalte schnell und komfortabel gleich in der Tabelle ändern, z.B. bei Vertipsern. Bei anderen Spalten klappt das nicht, so dass man deutlich mühsamer mit UPDATE arbeiten muss. Wieso das?