从mysql数据库中的所有表中选择第一列

时间:2009-07-22 08:42:34

标签: mysql subquery

我有一个名为“name”的列,它存在于mysql数据库的所有表中。

我想列出所有表中的所有名称,所以我使用了以下查询

select name from (SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE') as abc

但它对我不起作用,而是单独返回table_name列。

然后我使用show tables并将输出存储在另一个名为table_list的表中,然后我执行了以下查询

select name from (select table_name from table_list) as abc

这也给我带来了相同的结果,即所有的表名。

我能知道我做错了什么,做正确的方法是什么?

我正在使用MySQL 5.4,我想要在mysql中编写子查询或过程或函数。

2 个答案:

答案 0 :(得分:2)

有PREPARE和EXECUTE可以从用户变量中运行一个sql语句,所以可能会使用类似的(未经测试!)

SET @a = "";

SELECT @a := CONCAT('(select name from ',GROUP_CONCAT(table_name SEPARATOR ') UNION (select name from '),')') FROM information_schema.tables WHERE table_type='BASE TABLE' GROUP BY 1;

PREPARE stmt FROM @a;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

答案 1 :(得分:1)

你需要的是一种在SQL中拥有变量的方法(所以你可以说select * from $name where $name in (select ...))。 SQL不允许这样做。

我的建议是将过程分开:

首先运行此查询:

select 'select distinct name from ' || table_name || ' union'
from select table_name from table_list

那将给你选择运行。将它们放入一个小脚本中,删除最后一个“联合”并运行该脚本。

[编辑]如果MySQL在存储过程中支持“eval”运算符(即可以从部件构建SQL然后运行它),则可以执行此操作。我检查了文档,看起来没有eval。您也可以在C中编写一个扩展(参见chapter 22),它可以实现查找或“eval”函数。

但我的猜测是你的数据库不会一直改变。因此,最简单的解决方案是编写一个小的SQL脚本,为视图创建代码(这是一个字符串;它实际上并不创建视图)。每次数据库更改时,只需运行脚本重新创建视图,然后,您可以对视图运行查询以获取所有名称的列表。