Bobby: MySQL Tabellen aus ermittelten Wert auslesen und verwenden

Moin

Das Thema klingt vielleicht etwas komisch. Hier die Erklärung.

ich habe mehrere Tabellen in der Art:+

Tabelle Daten1
ID Name
1  test

Tabelle Daten2
ID Name
1  test

Nun habe ich eine Log-tabelle:

ID Tabelle Datensatz User Datum
1  Daten1     1       12  2009-01-01 01:01:01
2  Daten2     1       24  2009-01-01 01:01:01

Nun möchte ich die Log-Tabelle auslesen und gern per LeftJoin  die Daten aus den Datentabellen mit holen. Mir fehlt hierzu der Ansatz.

Ich dachte ähnlich:

  
SELECT  
Log.ID, Log.Tabelle, Log.Datensatz, Log.User User_ID, DATE_FORMAT( Datum, CONCAT( GET_FORMAT( DATE, 'EUR' ) , ' ', GET_FORMAT( TIME, 'ISO' ))) ,  
Log.Tabelle.Name  
FROM Log  
LEFT JOIN  
'Log.Tabelle'  
ON  
(Log.Tabelle.ID=Log.Datensatz)

Aber wie bekomme ich für die LeftJoin-Abfrage den ausgelesenen Tabellenenamen? Ist das überhaupt möglich?

Ich hoffe ihr versteht wie ich mir das gedacht habe.

Gruß Bobby

--
-> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
-> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  1. echo $begrüßung;

    Aber wie bekomme ich für die LeftJoin-Abfrage den ausgelesenen Tabellenenamen? Ist das überhaupt möglich?

    Vermutlich nicht, denn du versuchst hier Daten zu Befehlsbestandteilen zu machen und das würde ich selbst wenn es gibt zu vermeiden versuchen. Wer weiß, was durch eine Unachtsamkeit mal plötzlich als Datum dasteht und dann als Befehlsteil interpretiert wird.

    Wenn es nur um die beiden Tabellen geht, würde ich zwei einzelne Abfragen mit UNION verbinden.

    SELECT ...
      FROM Log
      LEFT JOIN Daten1
        ON Log.Datensatz = Daten1.ID AND Log.Tabelle = "Daten1"
      UNION
      das gleiche aber mit Daten2

    echo "$verabschiedung $name";

    1. Moin

      Das Problem ist, das es mindestens 14 Datentabellen gibt. Diese Anzahl kann zukünftig noch größer werden. In der Logdatei ist nur die Änderungszeit, der User, die Tabelle (Datentyp) und die Datensatzid gespeichert. Diese Daten möchte ich gern dynamisch geholt haben.

      Das Problem ist, das der Wert aus Log.Tabelle wie du schon sagst als Befehlsbestandteil (FROM ...) benutzt werden soll.

      Kann ich nicht einen ausgelesenen Wert irgendwie als Variable setzen und statt des Tabellennamen im Join verwenden?

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. Hallo,

        Das Problem ist, das es mindestens 14 Datentabellen gibt. Diese Anzahl kann zukünftig noch größer werden.

        das Datenbankdesign ist also sehr verbesserungswürdig aus.
        Gleiches gehört in die gleiche Tabelle.

        Freundliche Grüße

        Vinzenz

        1. Moin

          das Datenbankdesign ist also sehr verbesserungswürdig aus.
          Gleiches gehört in die gleiche Tabelle.

          Es geht in der Log-Tabelle darum wann welcher Adtensatz von wem geändert wurde. Wie sollte man deiner Meinung nach das aufbauen? Für jeden Datentyp eine eigene Log-Tabelle?

          Gruß Bobby

          --
          -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
          -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
          ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
          1. echo $begrüßung;

            Es geht in der Log-Tabelle darum wann welcher Adtensatz von wem geändert wurde. Wie sollte man deiner Meinung nach das aufbauen? Für jeden Datentyp eine eigene Log-Tabelle?

            Das kommt letztlich auf die genaue Aufgabenstellung an. Warum willst du überhaupt die Datentabellen dazujoinen? Wenn du 14 (und demnächst noch mehr) Tabellen hast, dann werden das ja hoffentlich nicht 14 Tabellen mit gleicher Struktur sein. Denn dann wäre zu fragen, warum das 14 Stück sind und nicht nur eine. Und wenn sie individuell aufgebaut sind, wie stellst du dir dann ein Joinergebnis bei den unterschiedlichen Tabellenstrukturen vor? Wenn du allerdings nur Felder abfragen möchtest, welche in allen Tabellen gleichermaßen vorhanden sind, was ist dann ihre Aufgabe? Mir fällt da als Anwendungsfall grad nur die ID und der Timestamp der letzten Änderung ein, aber das hast du ja beides schon in der Log-Tabelle.

            Also erzähl mal genauer, was am Ende rauskommen soll, vielleicht findet sich ja eine (andere) Lösung.

            echo "$verabschiedung $name";

            1. Moin

              Also erzähl mal genauer, was am Ende rauskommen soll, vielleicht findet sich ja eine (andere) Lösung.

              Es handelt sich um ein Abbild einer Access-DB. Ich kann an der Struktur nicht viel ändern. Es gibt verschiedene Hauptentitäten, die sich durchaus gleichen. Aufgrund der Datenmenhe sind diese getrennt. Dazu gibt es Beziehungstabellen.

              zb:
              Tabelle Daten1-Daten2
              Daten1_ID Daten2_ID
              1         1

              Tabelle Daten2-Daten14
              Daten2_ID Daten14_ID
              12        19

              Es werden hier verschiedene m:n, 1:n oder 1:n:m-Beziehungen dargestellt. (siehe wikipedia - Umsetzung des ER-Modells in Datenbanktabellen im relationalen Datenmodell - m:n. So in dieser Weise.

              Deshalb sind die Datentypen voneinader getrennt. Die Kardinalität ist extrem wichtig bei diesem Projekt. Und daraus ergibt sich die strikte Trennung der Daten, um Beziehungen 100%ig darstellen und trennen zu können.

              Also vom Aufbau ist schwerlich etwas änderbar. Ich dachte halt, das ich mit der Select-Abfrage eine Variable setzen kann, die ich innerhalb des Query als Tabelenname für das Join verwenden kann. Ich habs nun erstmal mit 2 Querys gelöst.

              Wäre aber hocherfreut wenn es da eine Datenbankinterne Lösung gäbe.

              Gruß Bobby

              --
              -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
              -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
              ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  2. yo,

    Aber wie bekomme ich für die LeftJoin-Abfrage den ausgelesenen Tabellenenamen? Ist das überhaupt möglich?

    ja, mit dynamischen sql oder wenn die anzahl der tabellen begrenzt ist, dann mit zwei abfragen oder einem UNION ALL. aber die frage ist, welche art von daten stehen den in daten1 und in daten2 drinne ?

    Ilja

    1. Moin

      ja, mit dynamischen sql oder wenn die anzahl der tabellen begrenzt ist, dann mit zwei abfragen oder einem UNION ALL. aber die frage ist, welche art von daten stehen den in daten1 und in daten2 drinne ?

      Die TAbellenanzahl ist eben nicht begrenzt. Kann also zukünftig noch wachsen. Wie funktioniert dynamisches SQL?

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)