【问题标题】:MySQL SELECT with unknown columnname具有未知列名的 MySQL SELECT
【发布时间】:2016-06-02 09:33:51
【问题描述】:

我需要这样的查询:SELECT id FROM database.table; 但是我没有主键的列名,因为查询必须对更多表是通用的。所以我试着做一个这样的查询:

SELECT (SELECT k.COLUMN_NAME AS pk_old
FROM information_schema.table_constraints t
LEFT JOIN information_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
    AND t.table_schema='database'
    AND t.table_name='table')as pk FROM database.table;

但是,我得到的不是具有该表的主键值的列表,例如 1,2,3,4... 我得到一个带有 id,id,id,id... 的列表。 如何获取主键的值?

【问题讨论】:

    标签: mysql select subquery


    【解决方案1】:

    使用prepare语句获取

    生成查询

    SELECT
      CONCAT( 'SELECT ',
      GROUP_CONCAT(CONCAT(COLUMN_NAME,' AS FIELD_',ORDINAL_POSITION)) ,
      ' FROM ', TABLE_SCHEMA,'.',TABLE_NAME,' ORDER BY ',
      GROUP_CONCAT(COLUMN_NAME)) INTO @query
    FROM information_schema.KEY_COLUMN_USAGE
    
    WHERE
      TABLE_SCHEMA = 'YourSchema'
    AND
      TABLE_NAME = 'YorTable'
    AND 
      CONSTRAINT_NAME='PRIMARY'
    ORDER BY ORDINAL_POSITION;
    

    验证(仅用于测试)

    SELECT @query;
    

    执行准备声明

    PREPARE stmt FROM @query;
    EXECUTE stmt;
    

    放下它

    DEALLOCATE PREPARE stmt;
    

    【讨论】:

      【解决方案2】:

      不,您不能简单地将子查询中的列名作为数据并将它们用作外部查询中选择列表的一部分。 SQL 不能以这种方式工作。您需要在 MySQL 之外的程序中或使用 prepared statement 组装您的查询。

      因此,您在单独的查询中查询列名并将它们放入一个字符串变量中,然后通过连接 sql 语句的各个部分将 select 语句创建为字符串,然后创建、执行和销毁准备好的语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多