从所有表中选择

11

我有很多具有相同结构的表格在我的数据库中。我想要从所有表格中选择,而不需要像下面这样罗列它们:

SELECT name FROM table1,table2,table3,table4

我尝试了,但这并不起作用:

SELECT name FROM *

有没有一种方法可以选择数据库中的所有表,而不需要在查询中列出每个表?


你可能需要执行一个联合操作 - 你下面的解决方案可以进行调整,创建一个动态 SQL 语句,类似于 'Select * from table1 union select * from table 2 union..'。 - Roopesh Shenoy
抱歉伙计,但这听起来像是一个非常糟糕的应用程序设计。如果您有相同结构的表格,您真的应该考虑将数据放入一个表格中! - Yves M.
6个回答

5
我正在开发一个在线文件浏览器,每个目录都有自己的表格。但由于其中一个原因它非常不实用:当你拥有大约200个文件时(这种情况是真实存在的),你就会拥有大约200个表格。如果每个目录中有大约一千个文件等等,在一段时间后,你将要么需要在从数据库中选择时处理缓慢,要么需要购买更多的服务器资源。 我认为你应该改变你的数据库结构:首先添加"parent_folder_id"列到你的表格中,之后你可以将所有的行(包括文件和目录——因为目录也是一个文件——你可以添加"type"列来确定其类型)放入一个表格中。

最后有一个人质疑整体解决方案。 - Yves M.

1

我找到了一个解决方案,但我仍然想知道是否有更简单或更好的解决方案。

但这是我想出来的:

$tables = mysql_query("show tables");
$string = '';
while ($table_data = mysql_fetch_row($tables)){
    $string.=$table_data[0].',';
}   
$ALL_TABLES = substr($string,0,strlen($string)-1);
$sql="SELECT name FROM $ALL_TABLES ";

我仍然认为您想要将每个表联合在一起,因为在FROM子句中指定"table1,table2,table3"等意味着您想要连接这些表(不同于按顺序追加它们),而且由于没有包含任何连接条件,这意味着您将获得笛卡尔积。 - sasfrog
2
我不推荐这种做法,但我有一个提示给你:http://www.php.net/implode - Dennis Haarbrink
是的,我熬了一整晚都在尝试弄对这个。我原先的解决方案行不通,因为当我尝试运行"SELECT name FROM $ALL_TABLES "时,出现了这个错误:"MySQL Error: #1052 - Column 'id' in field list is ambiguous"。所以我最后创建了一个包含所有文件的搜索表,在这个表上进行全文搜索。 - dlaurent86

1
据我所知,没有通配符可以从*所有表中选择。我建议编写一个视图,然后调用该视图(这将节省您每次编写名称的时间)- VoodooChild

1

这意味着您不应该拥有许多具有完全相同结构的表格。
而是只需要一个带有字段来区分不同种类数据的表格,无论它是什么。

然后选择所有将不会成为问题。


0

听起来你想要将每个表联合在一起,这样你就可以得到它们像一个大表一样的结果。你需要完整地编写查询语句,例如:

SELECT * FROM table1 UNION SELECT * FROM table2 UNION ... SELECT * FROM tableN

复制和粘贴可能是您的好朋友。

我很好奇为什么您有许多具有相同结构的不同表格?


我正在开发一个在线文件浏览器,每个目录都有自己的表格“files/pictures/,files/videos/,files/music/”等等。每个表格中的记录都包括文件的详细信息,如大小、名称、描述等等。最初,我将所有文件列在一个表格中。但是当记录超过5,000条时,查询速度变慢,因此现在每次添加一个目录时,表格会自动创建,每次上传文件时,记录也会自动存储。现在我正在尝试为用户创建搜索功能,并希望能够搜索所有目录或表格。 - dlaurent86
6
每个目录都有自己的表格。 - Your Common Sense
2
当查询5000条记录时变慢时,要么是该做一些索引或重新考虑表结构了。为每个目录创建一个表会比拥有带有适当索引和设计的单个表更容易出现性能问题。 - DrColossos
1
你的设计存在严重缺陷。当仅有5K条记录的表查询变慢时(这对于任何数据库引擎来说都是小菜一碟),你应该优化你的表结构和查询。 - Dennis Haarbrink
DrColossos- 最多只会有50个表,我并不是说查询很慢,抱歉。 我的脚本之所以很慢是因为我有一个scan.php脚本,它会循环遍历目录和子目录中的所有文件,并为jpg和flv文件创建缩略图,然后将记录插入到files表中。该脚本还会使用file_exists()检查文件是否存在于files表中,如果不存在,则会删除该记录。说实话,现在想想,我不确定为什么要为每个目录创建一个表,我猜当时似乎是个好主意。但现在,我一次只扫描一个目录。 - dlaurent86
当用户点击目录时,会出现一个以该目录命名的表格,ajax会从该表格返回所有结果(文件和文件夹)。这就是为什么我为每个目录都有一个表格。但我意识到我的设计可能不太好。现在它运行良好并且实现了我想要的功能。我认为我已经花费了太多时间在我的糟糕设计上,无法重新开始。所以我现在打算坚持下去。但我非常感谢你们的建议。谢谢。 - dlaurent86

0
您可以通过游标生成SELECT语句,像这样的代码,并在SQL Server中逐步查找所有结果:
--Author: Ah.Ghasemi

Declare @Select sysname;

DECLARE A CURSOR  
    FOR Select 'select ' + '*' + ' from ' + name 
        from sys.tables
        --Where  name like 'tbl%'
        Order by name
OPEN A 
FETCH NEXT FROM A INTO @Select
    While (@@FETCH_STATUS <>-1)
        Begin
            exec sp_executesql @Select

            FETCH NEXT FROM A INTO @Select;
        End

close A
Deallocate A

如果问题没有解决,请告诉我们。

祝你一切顺利。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接