我知道如何将一个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
);
答案 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;
顺便说一句,我不知道在单个查询中这样做的方法。您应该获取列信息,然后使用您的编码语言创建一个新查询,无论是什么。