代码之家  ›  专栏  ›  技术社区  ›  Anirudh Goel

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

  •  1
  • Anirudh Goel  · 技术社区  · 16 年前

    我有一个名为“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
    

    这也返回了相同的结果,即所有表名。

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

    我使用的是MySQL5.4,我想编写一个子查询、一个过程或者一个函数。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Aaron Digulla    16 年前

    您需要的是一种在SQL中使用变量的方法(因此您可以说 select * from $name where $name in (select ...) )SQL不允许这样做。

    我的建议是将流程拆分为:

    首先运行此查询:

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

    这将为您提供要运行的选择。将它们放入一个小脚本中,删除最后一个“union”并运行该脚本。

    [编辑]如果mysql在存储过程中支持一个“eval”操作符(也就是说,您可以从部分构建SQL然后运行它),那么您可以这样做。我查了一下文件,看起来好像没有评估。您还可以用C编写扩展名(请参见 chapter 22 )实现查找或“eval”功能。

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

        2
  •  2
  •   barryhunter    16 年前

    有可以从用户变量内部运行SQL语句的Prepare和Execute,因此可能使用类似于(Untested!)

    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;