具有未知列名的MySQL SELECT

时间:2016-06-02 09:33:51

标签: mysql select subquery

我需要这样的查询: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的列表.... 我该怎么做才能获得主键的值?

2 个答案:

答案 0 :(得分: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 STATEMENT

PREPARE stmt FROM @query;
EXECUTE stmt;

DROP it

DEALLOCATE PREPARE stmt;

答案 1 :(得分:0)

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

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