2017-02-06 3 views
-2

Ich habe mehrere Tabellen mit derselben Struktur. Alles, was ich will, ist alle Ergebnisse aus allen Tabellen aus einer Datenbank zu bekommen.MySQL SELECT * FROM Tabelle1, Tabelle2, Tabelle3

Zum Beispiel:

Tabelle 1:

id | Name 
----------- 
1 | John 
2 | Alex 
3 | Patrick 
4 | Donald 
5 | Jane 

Table2:

id | Name 
----------- 
1 | Ben 
2 | Dale 
3 | Kane 
4 | Tom 
5 | George 

Mein gewünschtes Ergebnis mit SELECT name FROM ... ist:

Name 
------- 
John 
Alex 
Patrick 
Donald 
Jane 
Ben 
Dale 
Kane 
Tom 
George 

Gibt es eine Möglichkeit, dies einfach zu tun, ohne UNION zu verwenden wie: SELECT * FROM table1 UNION SELECT * FROM table2 UNION SELECT * FROM table3 ....

Da dies macht meine Abfrage so lange und es ist Schmerz Ich werde wahrscheinlich mehr als 20-30 Tabellen in einer Datenbank haben. Ich suche nach etwas wie SELECT * FROM tabelle1, tabelle2 .. etc.

Danke.

UPDATE



Ich habe es wie folgt aus (in PHP), ich hoffe, es hilft auch für andere:

$dbc1 = $db->query("SELECT group_concat(table_name) AS tables FROM information_schema.tables WHERE table_schema='dbname'"); 

Diese Abfrage Rückkehr alle Tabellennamen als 1 String mit Komma getrennt wie folgt aus: Tabelle 1, Tabelle 2, table3 .... Dann explodieren ich diese Zeichenfolge und ich in foreach-Schleife.

$dbc1_ftchd = $dbc1->fetch(PDO::FETCH_ASSOC);  
foreach(explode(',',$dbc1_ftchd['tables']) as $next_tb_name){ 
     echo $next_tb_name.'<br>'; 
    } 

Jetzt kann ich alle Tabellen verwenden, wie ich eins nach dem anderen will, anstatt sie alle gleichzeitig zu verwenden. Aber kein Problem, es ist das gleiche Ergebnis für mich.

Vielen Dank an alle, die mir geholfen :)

+0

In welchem ​​Sinne meinen Sie "lang"? Es dauert zu lange oder die Länge der Abfragezeichenfolge ist "zu lang"? Wenn Letzteres, meinst du, zu lang für das RDBMS zu akzeptieren, oder zu viel tippen? – Uueerdo

+6

Mit 20-30 identische Tabellen ist ein Zeichen, dass etwas mit dem Datenbankdesign schrecklich schief gelaufen ist. – Uueerdo

+0

Ich meine Abfrage String ist zu lang, Entschuldigung für Missverständnisse. – ofarukcaki

Antwort

-2

Diese Arbeit sollte:

SELECT `Name` FROM `Table1` 
UNION 
SELECT `Name` FROM `Table2` 
UNION 
SELECT `Name` FROM `Table3` 

EDIT: Sorry, ich den letzten Absatz Ihrer Frage nicht gesehen haben. Sie können eine Ansicht oder eine temporäre Tabelle erstellen, wenn Sie UNIONs nicht so mögen.

Ansicht erstellen: https://dev.mysql.com/doc/refman/5.7/en/create-view.html

erstellen temporäre Tabelle: CREATE TEMPORARY TABLE IF NOT EXISTS tmp_table AS (SELECT * FROM table1 UNION ...)

+1

Das OP hat bemerkt, ohne UNION' – McNets

-1

Nein, UNION ist die Klausel für solche Dinge verwendet.

-1

Ohne eine UNION können Sie es mit einer FULL OUTER JOIN tun ... aber das ist nicht ratsam.

SELECT 
    ISNULL(Table1.Name, Table2.Name) AS Name 
FROM 
    Table1 
    FULL OUTER JOIN Table2 ON Table1.Name <> Table2.Name 

(ich bin mir nicht ganz sicher, dass dies in MySQL arbeiten, ich weiß nicht, ob es <> in JOIN Ausdrücke unterstützt)

+0

Es unterstützt so ziemlich alle Bedingungen, die Sie wollen (und dann einige); aber es unterstützt nicht FULL OUTER JOIN. – Uueerdo

0

Sie konnten die MERGE Storage Engine verwenden, um eine virtuelle Tabelle, deren Inhalt zu erstellen sind die Vereinigung von einer Reihe von anderen Tabellen:

CREATE TABLE AllTables (
    ... -- column definitions 
) ENGINE=MERGE UNION=(Table1, Table2, ...) 

Dann können Sie SELECT Name FROM AllTables verwenden.

Verwandte Themen