Transmitter: 3 Tabellen verknüpfen + Distinct :(

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

  1. 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 ?

    1. 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.

      1. 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

        1. 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

  2. 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

    --

    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. 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! :(

      1. 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

        --

        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  3. 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

  4. 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