Tabellen aus verschiedenen DB wie einzige Tabelle ansprechbar?
Günther S
- datenbank
Hallo miteinander,
ich habe mehrere Datenbanken, die alle exakt dieselben Tabellen mit derselben Struktur besitzen (nur die Datensätze sind unterschiedlich).
Nun möchte ich an manchen Stellen ermöglichen, dass man z.B. wenn man News anzeigt, nicht nur die News aus einer Datenbank geladen werden, sondern aus mehreren. Das ganze allerdings, _ohne_ bei jedem Query jede Tabelle aus jeder Datenbank einzeln aufzuführen.
Hier ein kleines Beispiel:
SELECT titel, inhalt, datum FROM news
Mithilfe dieser Anfrage, möchte ich dieselben Ergebnisse bekommen, die man normalerweise folgenderweise bekommen würde:
SELECT titel, inhalt, datum FROM db1.news, db2.news, db3.news [...]
Es handelt sich um ein Netzwerk von Seiten. Als "Starthilfe" neuer Seiten innerhalb dieses Netzwerkes möchte ich z.B. auch die News von anderen Seiten des Netzwerkes anzeigen lassen (ohne dafür jedes mal explizit meine mysql queries umschreiben zu müssen).
Gibt es da seitens MySQL (oder PHP) eine Möglichkeit (abgesehen davon, z.B. einfach die News in die Datenbanken neuer Seiten zu kopieren), das zu realisieren?
Gruß,
Günther
echo $begrüßung;
ich habe mehrere Datenbanken, die alle exakt dieselben Tabellen mit derselben Struktur besitzen (nur die Datensätze sind unterschiedlich).
Nun möchte ich an manchen Stellen ermöglichen, dass man z.B. wenn man News anzeigt, nicht nur die News aus einer Datenbank geladen werden, sondern aus mehreren. Das ganze allerdings, _ohne_ bei jedem Query jede Tabelle aus jeder Datenbank einzeln aufzuführen.
Es gibt keine Möglichkeit, Jokerzeichen in der FROM-Klausel anzugeben. Du musst da schon die einzelnen Tabellen angeben. Das kann man natürlich auch per Script zusammenbauen, wenn man die Tabellennamen weiß oder vorher mit SHOW DATABASES die Datenbanknamen erfragt und anschließend mit SHOW TABLES FROM database LIKE ... die Tabellennamen ermittelt hat.
echo "$verabschiedung $name";
Hallo dedlfix,
Es gibt keine Möglichkeit, Jokerzeichen in der FROM-Klausel anzugeben. Du musst da schon die einzelnen Tabellen angeben. Das kann man natürlich auch per Script zusammenbauen, wenn man die Tabellennamen weiß oder vorher mit SHOW DATABASES die Datenbanknamen erfragt und anschließend mit SHOW TABLES FROM database LIKE ... die Tabellennamen ermittelt hat.
Das habe ich befürchtet :(
Die Datenbanknamen und Tabellennamen sind mir bekannt.
Das Problem ist nur, dass diese Tabellennamen keineswegs z.B. nur in der FROM-Klausel vorkommen, sondern auch in mittelmäßig komplexen WHERE-Blöcken usw.
Dafür ein oder zwei einheitliche Scripte zu basteln, die die Tabellennamen trotzdem logisch richtig und mit korrekter Syntax zusammenbasteln erscheint mir überdimensional aufwändig.
Nach meinem momentanen Erkenntnisstand scheint mir daher die sinnvollste Lösung doch das Kopieren einzelner Datensätze in die neuen DB zu sein, aber falls noch jemand Ideen hätte, wäre ich sehr dankbar dafür.
Gruß,
Günther S
Huhu Günther,
vielleicht kann Dir eine Merge-Tabelle helfen.
http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html
Viele Grüße
lulu
Moin!
SELECT titel, inhalt, datum FROM news
>
> Mithilfe dieser Anfrage, möchte ich dieselben Ergebnisse bekommen, die man normalerweise folgenderweise bekommen würde:
>
> ~~~sql
> SELECT titel, inhalt, datum FROM db1.news, db2.news, db3.news [...]
>
Da hast du ja schon einen falschen Ansatz. Dein FROM erzeugt einen Cross-JOIN, du beschreibst textlich aber ein UNION-SELECT. Das sind zwei komplett unterschiedliche Dinge.
Und auch sonst ist die wirkliche Lösung deines Problems vermutlich eher die Vereinigung aller Datenbanken in eine neue, der du zusätzlich Mandantenfähigkeit angedeihen läßt, um die Datenbestände auch weiterhin getrennt voneinander behandeln zu können.
- Sven Rautenberg
Hallo Sven,
Da hast du ja schon einen falschen Ansatz. Dein FROM erzeugt einen Cross-JOIN, du beschreibst textlich aber ein UNION-SELECT. Das sind zwei komplett unterschiedliche Dinge.
Da hast du natürlich Recht. Ich hatte bisher noch nicht so viel mit JOINs zu tun und habe einfach intuitiv einen Query aufgebaut. Ich hätte mich wohl zuvor schon im MySQL-Manual schlau machen sollen - nicht erst jetzt.
Gruß,
Günther