我有几个结构相同的表。我想要的只是从数据库中获取所有表的所有结果。
例如:
表1:
id | Name
-----------
1 | John
2 | Alex
3 | Patrick
4 | Donald
5 | Jane
表2:
id | Name
-----------
1 | Ben
2 | Dale
3 | Kane
4 | Tom
5 | George
我想要的结果 SELECT Name FROM ... 是:
Name
-------
John
Alex
Patrick
Donald
Jane
Ben
Dale
Kane
Tom
George
有没有办法在不使用UNION的情况下轻松完成此操作: SELECT * FROM table1 UNION SELECT * FROM table2 UNION SELECT * FROM table3 ....
因为这使得我的查询时间太长而且对我来说很痛苦。可能我在数据库中有超过20-30个表。我正在寻找像 SELECT * FROM table1,table2 ..等等的东西。
感谢。
更新
<小时/> <小时/>
我这样做(在PHP中),我希望它也有助于其他人:
$dbc1 = $db->query("SELECT group_concat(table_name) AS tables FROM information_schema.tables WHERE table_schema='dbname'");
此查询将所有表名称返回为1个字符串,其逗号分隔如下: table1,table2,table3 .... 然后我爆炸了那个字符串,我在foreach循环中使用。
$dbc1_ftchd = $dbc1->fetch(PDO::FETCH_ASSOC);
foreach(explode(',',$dbc1_ftchd['tables']) as $next_tb_name){
echo $next_tb_name.'<br>';
}
现在我可以逐个使用所有表,而不是同时使用所有表。但没问题,这对我来说是同样的结果。
感谢所有帮助过我的人:)
答案 0 :(得分:0)
您可以使用MERGE Storage Engine创建一个虚拟表,其内容是一组其他表的并集:
CREATE TABLE AllTables (
... -- column definitions
) ENGINE=MERGE UNION=(Table1, Table2, ...)
然后您可以使用SELECT Name FROM AllTables
。
答案 1 :(得分:-1)
不,UNION是用于此类事情的条款。
答案 2 :(得分:-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
答案 3 :(得分:-2)
这应该有效:
SELECT `Name` FROM `Table1`
UNION
SELECT `Name` FROM `Table2`
UNION
SELECT `Name` FROM `Table3`
编辑:抱歉,我没有看到你问题的最后一段。如果您不喜欢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 ...)