代码之家  ›  专栏  ›  技术社区  ›  cwallenpoole

在MySQL中动态选择列

  •  2
  • cwallenpoole  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  6
  •   Jaka Jančar    15 年前

    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)
    
        2
  •  1
  •   Greg    15 年前

        3
  •  1
  •   Bill Karwin    15 年前

    在回答第一个问题时,你应该学习如何做 JOIN 在SQL中。联接是SQL语言中的基本操作。理解如何用其他语言进行循环同样重要。

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

    关于第二个问题,不,不能在一条语句中使表名或列名成为动态的。

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

        4
  •  0
  •   Seb    15 年前

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

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

    SELECT * FROM information_schema.`COLUMNS` C;
    

    顺便说一句,我不知道如何在一个查询中实现这一点。您应该获取列信息,然后用您的编码语言创建一个新的查询,不管它是什么。