MySQL: SELECT-Abfrage bei mehreren Werten in einer Spalte

Zvoni

Erfahrenes Mitglied
Okay, dann kommen die Links in die veranstaltungstabelle... Danke!
Bei solchen Sachen musst du dir eigentlich immer nur eine Frage stellen: ist es eine "1 zu 1"-Beziehung?
Falls Ja, kannst du es direkt in derselben Tabelle speichern.
Im konkreten Fall: Hast du jedesmal (also zu jeder Veranstaltung) immer auch nur einen Link?
Oder kann es sein, dass es mehrere Links gibt/geben wird (Bsp. 1 Link für Veranstaltungsort, 1 Link für Teilnehmer, 1 Link für Sponsoren etc.).

Solche Überlegungen gehören in den Bereich "Normalisierung"
 

Yaslaw

n/a
Moderator
überleg dir einfach mal, wie eindeutig die Dinge sind.
Die Veranstalltung hat EINEN Link. Jeder Link gehärt genau zu EINER Veranstalltung.
Also kann an si in die gleiche Tabelle schreiben

Eine Veranstallung hat EINEN Veranstallter. Aber ein Veranstallter kann MEHRERE Veranstalltungen organisieren.
Also gehört der Veranstalter in eine Eigene Tabelle. In die Veranstalltungstabelle wird nur noch die ID des Veranstallters gespeichert.

Eine Veranstalltung hat MEHRERE Teilnehmer. Jeder Teilnehmer kann MEHRERE Veranstalltungen besuchen.
Da kommt das System wie weiter oben in diesem Thread erklärt. Eine Tabelle für die Teilnehmer und eine für die Zuordnung Teilnehmer <-> Veranstalltung.
 

Tuppie

Mitglied
Hallo,

ich habe mir nun für mein Projekt Folgendes überlegt. Zum eigentlichen Projekt, denn die "Sportveranstaltungen waren ein Beispiel: auf meiner Website liegen in Form von htm-Dateien Informationen zu Himalaya-Expeditionen. Nun möchte ich mittels einer Datenbank nach folgenden Kriterien suchen können: welche Exp. fanden in einem bestimmten Jahr statt? Welche Exp. wurden von Leiter XY als Leiter durchgeführt? Wer nahm an Exp. XY teil? Welche Exp. hatten z.B. den Mount Everest als Ziel?

Hier habe ich mir den Vorschlag von Yaslaw vom 10. Januar angeschaut und 5 Tabellen angelegt:
1.: Tabelle expedition mit dem eindeutigen Namen und Link auf meiner Website. Die Einträge bekommen eID als Index
2.: Eine über pID sortierte Tabelle personen, jeder Name taucht hier 1x auf
3. in der Tabelle teilnehmer weise ich den eID´s die entsprechenden pID´s zu
4. die Tabelle leiter weise ich den lID´s die entsprechenden Exp. über eID zu
5. das entsprechenden Jahr in der Tabelle jahr wird der Exp. über die jeweilige eID zugewiesen

Mir fällt gerade auf, dass die Tabelle expedition noch eine Spalte bekommen müsste, wo der Exp.leiter über die Angabe der lID klargemacht wird, oder wie löse ich die Sache am besten? Über die lID ist ja klar, welche Person das laut pID ist. Oder?

Gebt man bitte Euer Feedback, ob die Struktur so sinnvoll ist, das wäre mir sehr wichtig.
Dann kann ich die Tabellen mit Leben füllen, das wird dauern, und mich in der Zwischenzeit schlau machen, wie man die Daten dann abfragt.

db_tabellen.jpg
 

Zvoni

Erfahrenes Mitglied
Sieht gut aus.
Die Tabelle eID-Jahr halte ich für überflüssig. Die Jahresangabe kann man auch direkt in die Expeditions-Tabelle nehmen, da die Jahresangabe im Prinzip ein Integer ist (oder 4-stelliger Text). Du gewinnst also nichts im Sinne von "Reduzierung von Datenvolumen".

Und du hast die Jahresangabe eh schon im Text der Expedition.
Heisst: separate Spalte "Jahr", und die Jahresangabe im Text weglassen (kann man aber auch drin lassen)
 

Tuppie

Mitglied
Sieht gut aus.
Die Tabelle eID-Jahr halte ich für überflüssig. Die Jahresangabe kann man auch direkt in die Expeditions-Tabelle nehmen, da die Jahresangabe im Prinzip ein Integer ist (oder 4-stelliger Text). Du gewinnst also nichts im Sinne von "Reduzierung von Datenvolumen".

Und du hast die Jahresangabe eh schon im Text der Expedition.
Heisst: separate Spalte "Jahr", und die Jahresangabe im Text weglassen (kann man aber auch drin lassen)
Danke Zvoni.

Ich dachte, die eID-Jahr-Tabelle wäre sinnvoll, da in einem Jahr verschiedene Exp. stattgefunden haben. Aber wahrscheinlich kann die wirklich raus.

Wie baue ich die Abfragemöglichkeit nach dem Exp.leiter am besten ein? Ein Teilnehmer einer jeden Exp. hatte die Leitung inne, es soll also auch eine Abfrage möglich sein, wie z.B. "Gib alle Exp. aus, bei denen XY Leiter war".
 

Zvoni

Erfahrenes Mitglied
Aircode. Ausprobieren!
SQL:
SELECT
expedition.Expedition,
expedition.Link
FROM
expedition, teilnehmer, leiter, person
WHERE
teilnehmer.eID=expedition.eID AND
leiter.lID=teilnehmer.pID AND
person.pID=leiter.pID AND
person.Vorname='Charles' AND
person.Nachname='Bruce'

EDIT: Nach Überlegung kannst du auch ein Feld "LID" direkt in Expedition einfügen (welches einen gültigen Eintrag auf die Person-Tabelle hat, welcher wiederum auch in der Teilnehmer-Tabelle vorkommen muss), und dir die "Mix"-Tabelle sparen
Die Abfrage würde dann in etwa so aussehen (Aircode)
SQL:
SELECT
expedition.Expedition,
expedition.Link
FROM
expedition, teilnehmer, person
WHERE
teilnehmer.eID=expedition.eID AND
expedition.lID=person.pID AND
person.pID=teilnehmer.pID AND
person.Vorname='Charles' AND
person.Nachname='Bruce'
 
Zuletzt bearbeitet:

Tuppie

Mitglied
Aircode. Ausprobieren!
SQL:
SELECT
expedition.Expedition,
expedition.Link
FROM
expedition, teilnehmer, leiter, person
WHERE
teilnehmer.eID=expedition.eID AND
leiter.lID=teilnehmer.pID AND
person.pID=leiter.pID AND
person.Vorname='Charles' AND
person.Nachname='Bruce'

EDIT: Nach Überlegung kannst du auch ein Feld "LID" direkt in Expedition einfügen (welches einen gültigen Eintrag auf die Person-Tabelle hat, welcher wiederum auch in der Teilnehmer-Tabelle vorkommen muss), und dir die "Mix"-Tabelle sparen
Die Abfrage würde dann in etwa so aussehen (Aircode)
SQL:
SELECT
expedition.Expedition,
expedition.Link
FROM
expedition, teilnehmer, person
WHERE
teilnehmer.eID=expedition.eID AND
expedition.lID=person.pID AND
person.pID=teilnehmer.pID AND
person.Vorname='Charles' AND
person.Nachname='Bruce'
Ich danke Dir Zvoni für Deine Meinung & Zeit, ich werde probieren...
 

Tuppie

Mitglied
Ich versuche gerade (vergeblich), eine Abfrage zu formulieren, bei der mir die Teilnehmer einer konkreten Expedition angezeigt werden. Meine Abfrage sieht so aus:

SELECT
personen.Vorname, personen.Nachname
FROM
expedition, teilnehmer, personen
WHERE
teilnehmer.pID=expedition.eID AND
expedition.eID=3


In der Teilnehmerliste sind ja die entsprechenden Personen-ID´s "pID" den zugehörigen Expeditions-ID´s "eID" zugeordnet. Hier bekomme ich aber alle Namen ausgegeben, die in der Personentabelle eingetragen sind. Warum funktioniert die eingrenzende Zeile

AND
expedition.eID=3

nicht? Bzw. wo ist mein Denkfehler?
Freue mich auf Kommentare...
 

Sprint

Erfahrenes Mitglied
Im WHERE Teil fehlt die Beziehung zur Personen Tabelle. Daher wird da nichts eingegrenzt und es werden alle Namen ausgegeben.
 

Neue Beiträge