3 Tabellen verknüpfen + Distinct :(
Transmitter
- datenbank
0 Felix S0 Transmitter0 Felix S
0 Rouven0 Transmitter0 Rouven
0 Klaus Mock0 Ilja
Hi!
Irgendwie komme ich nicht weiter :(
Habe 3 Tabellen:
Veranstaltung
-------------
ID
Bezeichung
usw.
Datum
-----
ID
Datum
VeranstaltungDatum
------------------
Veranstaltung_ID
Datum_ID
Um Redundanz zu vermeiden habe ich die Daten in die Datum Tabelle ausgelagert, weil eine Veranstaltung durchaus öfters aufgeführt werden kann ;)
Und das habe ich jetzt:
SELECT DISTINCT * FROM Veranstaltung
LEFT JOIN VeranstaltungDatum ON Veranstaltung.ID = VeranstaltungDatum.Veranstaltung_ID
LEFT JOIN Datum ON VeranstaltungDatum.Datum_ID = Datum.ID
Da werden jetzt sämtliche Veranstaltungen ausgewählt, auch die die öfters aufgeführt werden aber das wollte ich eigentlich vermeiden.
Also jede Veranstaltung soll einmal ausgewählt werden, mit dem passendem Datum .. wie mache ich das denn?
Ich komme einfach nicht weiter :(
Danke schon mal :)
Bye, Transmitter
das schaut irgendwie spanisch aus ;-)
Was benutzt du???? Oracle, Access, ...?
Das wär schon wichtig für eine Antwort
Wie sind die Tabellen miteinander verknüpft ?
das schaut irgendwie spanisch aus ;-)
Sollte eigentlich Deutsch sein *heul* ;) :(
Was benutzt du???? Oracle, Access, ...?
Sorry, habe ich vergessen zu schreiben,
benutze MySQL
Das wär schon wichtig für eine Antwort
Wie sind die Tabellen miteinander verknüpft ?
ID von Datum und Veranstaltung sind je die Primary + Unique
Und die VeranstaltungDatum soll die n:m relationship aufdröseln.
SELECT DISTINCT *
FROM VeranstaltungDatum INNER JOIN (Veranstaltung INNER JOIN (Datum IMMER JOIN ON Veranstaltung.ID = VeranstaltungDatum.Veranstaltung_ID) ON VeranstaltungDatum.Datum_ID = Datum.ID)
glaube aber nicht das das stimmt, ist nur geraten
mysql check ich nicht wirklich sorry
SELECT DISTINCT *
FROM VeranstaltungDatum INNER JOIN (Veranstaltung INNER JOIN (Datum IMMER JOIN ON Veranstaltung.ID = VeranstaltungDatum.Veranstaltung_ID) ON VeranstaltungDatum.Datum_ID = Datum.ID)glaube aber nicht das das stimmt, ist nur geraten
Nein, da gibts Probleme mit den ON´s ..
Error Msg:
Check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON Veranstaltung.ID = VeranstaltungDatum.Veranstaltung_ID ) ON
Hi,
Da werden jetzt sämtliche Veranstaltungen ausgewählt, auch die die öfters aufgeführt werden aber das wollte ich eigentlich vermeiden.
Also, sagen wir mal so, ich weiß zwar leider nicht, was in deinen Tabellen drinsteht, aber ich vermute mal, wenn du da mehr als einen Satz rauskriegst, dann müssen die sich durch irgend etwas unterscheiden. Das Problem liegt bei
SELECT *
Wenn du alles auswählst, kriegst du auch alles - Irgend ein Unterschied ist da, ein DISTINCT * macht AFAIK keinen Sinn, weil sich alle Sätze einer relationalen Datenbank (es sei denn, sie haben keinen Primärschlüssel) durch irgendetwas (und sei es der Primärschlüssel) unterscheiden. Also werden auch alle geliefert.
Also jede Veranstaltung soll einmal ausgewählt werden, mit dem passendem Datum .. wie mache ich das denn?
Ich komme einfach nicht weiter :(
Versuch mal:
SELECT DISTINCT bezeichnung, datum
FROM Veranstaltung
LEFT JOIN VeranstaltungDatum ON Veranstaltung.ID = VeranstaltungDatum.Veranstaltung_ID
LEFT JOIN Datum ON VeranstaltungDatum.Datum_ID = Datum.ID
MfG
Rouven
Also, sagen wir mal so, ich weiß zwar leider nicht, was in deinen Tabellen drinsteht, aber ich vermute mal, wenn du da mehr als einen Satz rauskriegst, dann müssen die sich durch irgend etwas unterscheiden. Das Problem liegt bei
SELECT *
Wenn du alles auswählst, kriegst du auch alles - Irgend ein Unterschied ist da, ein DISTINCT * macht AFAIK keinen Sinn, weil sich alle Sätze einer relationalen Datenbank (es sei denn, sie haben keinen Primärschlüssel) durch irgendetwas (und sei es der Primärschlüssel) unterscheiden. Also werden auch alle geliefert.
Ja, das kann sein, dass DISTINCT nicht so viel Sinn macht, aber mein Problem ist:
dass Veranstaltung xy mit der ID 5 in der
VeranstaltungDatum folgendermaßen gelinkt ist:
5 | 7
5 | 8
5 | 9
Jetzt werden die Daten 7,8,9 aus der Datum Tabelle gelesen, und das will ich vermeiden, es soll nur einmal ausgelesen werden.
Versuch mal:
SELECT DISTINCT bezeichnung, datum
FROM Veranstaltung
LEFT JOIN VeranstaltungDatum ON Veranstaltung.ID = VeranstaltungDatum.Veranstaltung_ID
LEFT JOIN Datum ON VeranstaltungDatum.Datum_ID = Datum.ID
Leider auch nicht, meine Veranstaltungen werden nach wie vor doppelt bzw. mehrfach angezeigt :(
Ich möchte sowas wie:
SELECT * FROM Veranstaltung
Aber so, dass ich das Datum noch per PHP ausgeben kann.
Und das bekomme ich nicht hin! :(
Ja, das kann sein, dass DISTINCT nicht so viel Sinn macht, aber mein Problem ist:
dass Veranstaltung xy mit der ID 5 in der
VeranstaltungDatum folgendermaßen gelinkt ist:
5 | 7
5 | 8
5 | 9
Jetzt werden die Daten 7,8,9 aus der Datum Tabelle gelesen, und das will ich vermeiden, es soll nur einmal ausgelesen werden.
OK, welches Datum willst du denn haben?? Die Veranstaltung wurde drei Mal eingetragen, welches Datum soll in der Abfrage rauskommen. Du könntest mit so Sachen wie MAX oder MIN arbeiten, um nur eines der Daten zu erhalten, aber ansonsten wird das schwierig.
MfG
Rouven
Hallo,
Also jede Veranstaltung soll einmal ausgewählt werden, mit dem passendem Datum .. wie mache ich das denn?
Definiere 'passendes Datum' und Du hast Die Antwort auf Dein Problem.
Grüße
Klaus
yo,
SELECT DISTINCT * FROM Veranstaltung
LEFT JOIN VeranstaltungDatum ON Veranstaltung.ID = VeranstaltungDatum.Veranstaltung_ID
LEFT JOIN Datum ON VeranstaltungDatum.Datum_ID = Datum.ID
für testzwecke mag es sinnvoll sein einen * für alle spalten zu wählen, im betrieb sollte das aber vermieden werden, wenn kein wirklicher grund dafür darliegt.
des weiteren erscheinen mir deine drei tabellen auf den ersten blick als eine zuviel. es sei den, die gleiche veranstaltung kann auch beim gleichen datum (tag, bzw. stunde) mehrfach vorkommen. ist dies nicht der fall, könnte man sie zu zwei kürzen.
Veranstaltung
-------------
ID <---- Primärschlüssel
Bezeichung
usw.
VeranstaltungDatum
------------------
Veranstaltung_ID <---- Primärschlüssel
Datum <---- Primärschlüssel
ich nehme das einfach mal an, dass ein und dieselbe veranstaltung nicht am gleichen tag, stunde mehrfach vorkommt. damit habe ich dann einen zusammengesetzten primärschlüssel über zwei spalten, der meine datensätze eindeutig identifizieren kann.
Also jede Veranstaltung soll einmal ausgewählt werden, mit dem passendem Datum .. wie mache ich das denn?
Ich komme einfach nicht weiter :(
da gibt es mehrere möglichkeiten und hängt ein wenig von deinen vorgaben ab. die erste frage ist, willst du alle Datumswerte haben, wo eine veranstaltung stattgefunden hat und stattfinden wird. also benötigst du auch die vergangennen veranstaltungen oder kann man diese schon einmal rausschmeissen. dann ist die frage, ob du alle kommenden veranstaltungen brauchst oder dir das nächst kommende datum reicht. bei nur einem gesuchten datumswert, kann man das dann mit einer abfrage lösen.
willst du mehrere datumswerte haben, dann gibt es zwei wege. entweder so, wie du es gemacht hast und du ordnest die ergebnisse auf programmebene, zum beispiel mit php. oder aber du gehst über zwei abfragen. in der ersten suchst du nach den veranstalter und in der zweiten nach den entsprechenden datumswerten, wobei du innerhalb der schleife der ersten abfrage, die zweite abfrage machst.
1. SELECT id, veranstaltungsname, organisator... FROM veranstaltung;
2. SELECT datum FROM veranstaltungdatum WHERE veranstaltungs_id=id_des_veranstalters_aus_der_ersten_abfrage;
damit hättest du in der ersten tabelle nur einen Veranstalter und alle seine datumswerte in der zweiten.
Ilja