2017-02-06 5 views
-2

У меня есть несколько таблиц с одинаковой структурой. Все, что я хочу, это получить все результаты из всех таблиц из базы данных.MySQL SELECT * FROM table1, table2, table3

Например:

Table1:

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 

Мой желаемый результат с Выбрать Название FROM ... является:

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

Есть ли способ сделать это легко и без использования UNION, как: SELECT * FROM table1 UNION SELECT * FROM table2 UNION SELECT * FROM Table3 ....

Поскольку это делает мой запрос так долго, и это боль для me.Probably у меня будет более 20-30 таблиц в базе данных. Я ищу что-то вроде SELECT * FROM table1, table2 .. и т. Д.

Спасибо.

UPDATE



Я сделал это так (в PHP), я надеюсь, что это помогает также для других:

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

Это возвратные запрос имена всех таблиц, как 1 строка с запятой разделили вот так: таблица1, таблица2, таблица3 .... Тогда я взорву эту строку, и я использовал ее в цикле foreach.

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

Теперь я в состоянии использовать все таблицы, как я хочу, один за другим, вместо использования их все одновременно. Но не проблема, это для меня тот же результат.

Спасибо всем, кто помог мне :)

+0

В каком смысле вы имеете в виду «долго»? Это занимает слишком много времени, или длина строки запроса «слишком длинная»? Если последнее, вы имеете в виду слишком долго для РСУБД принимать или слишком много печатать? – Uueerdo

+6

Наличие 20-30 идентичных таблиц - это признак, что что-то пошло с ошибкой в ​​дизайне базы данных. – Uueerdo

+0

Я имею в виду, строка запроса слишком длинная, извините за недоразумение. – ofarukcaki

ответ

-2

Это должно работать:

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

EDIT: К сожалению, я не видел, последний абзац вашего вопроса. Вы можете создать представление или временную таблицу, если вам не нравятся UNION.

Создать вид: https://dev.mysql.com/doc/refman/5.7/en/create-view.html

Создать временную таблицу: CREATE TEMPORARY TABLE IF NOT EXISTS tmp_table AS (SELECT * FROM table1 UNION ...)

+1

ОП отметил «без использования UNION» – McNets

-1

Нет, UNION является пункт используется для таких вещей.

-1

Без UNION вы можете сделать это с помощью FULL OUTER JOIN ... но это нецелесообразно.

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

(я не совсем уверен, что это будет работать в MySQL, я не знаю, если он поддерживает <> в JOIN выражения)

+0

Он поддерживает практически любые условия, которые могут вам понадобиться (а затем некоторые); но он не поддерживает FULL OUTER JOIN. – Uueerdo

0

Вы можете использовать MERGE Storage Engine создать виртуальную таблицу, содержимое которого объединение множества других таблиц:

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

Затем вы можете использовать SELECT Name FROM AllTables.

Смежные вопросы