MySQL Tabellen aus ermittelten Wert auslesen und verwenden
Bobby
- datenbank
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
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";
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
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
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
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";
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
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
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