【问题标题】:selecting first column from all tables in a mysql database从mysql数据库中的所有表中选择第一列
【发布时间】:2009-07-22 08:42:34
【问题描述】:

我有一个名为“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 中编写子查询或过程或函数。

【问题讨论】:

    标签: mysql subquery


    【解决方案1】:

    有 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;

    【讨论】:

      【解决方案2】:

      您需要的是一种在 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,然后运行它),您可以这样做。我检查了文档,看起来没有评估。您还可以用 C 编写一个扩展(参见 chapter 22),它可以实现查找或“eval”函数。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-30
        • 2014-11-23
        • 2021-12-30
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多