在MySQL中动态选择列

时间:2009-04-06 20:49:38

标签: mysql

我知道如何将一个MySQL查询传递给另一个:

SELECT user_name FROM users WHERE user_id=( SELECT user_id FROM entries WHERE header="foo" );

出于纯粹的求知欲,我如何动态选择一个列或一个表?

例如:

SELECT ( 
    SELECT column_name FROM column_names WHERE id = 1 
) FROM ( 
    SELECT table_name FROM table_names WHERE id = 1 
); 

4 个答案:

答案 0 :(得分:6)

使用预先准备好的声明:

mysql> SET @sql = CONCAT("SELECT ", (SELECT "NOW()"));
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @sql;
+--------------+
| @sql         |
+--------------+
| SELECT NOW() | 
+--------------+
1 row in set (0.00 sec)

mysql> PREPARE stmt FROM @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE stmt;
+---------------------+
| NOW()               |
+---------------------+
| 2009-04-06 23:08:31 | 
+---------------------+
1 row in set (0.00 sec)

答案 1 :(得分:1)

我很确定使用常规查询或视图是不可能的。

答案 2 :(得分:1)

在回答第一个问题时,您应该了解如何在SQL中执行JOIN。连接是SQL语言中的基本操作。理解如何在其他语言中进行循环同样重要。

SELECT DISTINCT users.user_name
FROM users JOIN entries USING (user_id)
WHERE entries.header = 'foo';

关于第二个问题,不,你不能在一个声明中使表名或列名动态化。

但是,您可以在应用程序中编写代码,以基于查找列名和表名来构建SQL语句作为字符串。然后将结果字符串作为新的SQL查询执行。

答案 3 :(得分:0)

您可以通过查询information_schema.columns表来完成此操作。

执行此操作并检查结果。我不确定你要做什么,但该表包含与你的列相关的任何内容:

SELECT * FROM information_schema.`COLUMNS` C;
顺便说一句,我不知道在单个查询中这样做的方法。您应该获取列信息,然后使用您的编码语言创建一个新查询,无论是什么。