MySQL:使用子查询在SELECT语句中定义列

时间:2014-01-24 22:02:05

标签: mysql sql select subquery

我想指定使用子查询选择哪些列;这在MySQL可能吗?例如,我有两个表:

CREATE TABLE table1 (
  table1_id INT,
  number VARCHAR,
  color VARCHAR,
  shape VARCHAR,
  .
  .
  .
  PRIMARY KEY (table1_id)
);
INSERT INTO table1 ('1', '25', 'purple', 'circle');
INSERT INTO table1 ('2', '30', 'orange', 'triangle');
INSERT INTO table1 ('3', '82', 'blue', 'square');

CREATE TABLE table2 (
  name VARCHAR,
  display BOOL,
  flag2 BOOL,
  .
  .
  PRIMARY KEY (name)
);
INSERT INTO table2 ('number', '0', '1');
INSERT INTO table2 ('color', '1', '1');
INSERT INTO table2 ('shape', '1', '1');

table2中的每个'name'是table1中的一个列名('par1','par2'等)。由于数据的创建和输入数据库的方式,这些并非全部组合在一起 我想做一个select语句(然后将用于创建视图),其中我只返回table2中由flags定义的table1中的列。所以,我想做一些事情:

SELECT (SELECT name FROM table2 WHERE (flag1="1" && flag2="0")) FROM table1;

编辑: 似乎这样的事情应该有效:

SELECT * FROM table1 as t1, table2 as t2 
WHERE t2.name IN(
    SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA='db_name' 
    AND TABLE_NAME='table1') 
AND t2.display="1";

如果我列出了各个列名而不是子查询它确实有效,但是我无法让mysql以正确的格式返回列名。

使用上面添加的示例数据,我想从table1中选择每一列,其中table2中的条目带有display = true。因此,它应该返回table1中每个条目的“颜色”和“形状”数据。

编辑2: 上面的方法不起作用,因为它仍然选择table1中的所有列,而不管table2中的条件如何。我怀疑这在mysql中是不可能的,因为根据我能够找到的所有内容,你不能使用子查询来选择要返回的列。

鉴于上面的例子,我想要的回报是:

+-------------------+
| color  | shape    |
+-------------------+
| purple |   circle |
| orange | triangle |
|   blue |   square |
+-------------------+

1 个答案:

答案 0 :(得分:0)

试试这个:

    SET @sql = (

    SELECT GROUP_CONCAT(COLUMN_NAME) FROM
      (SELECT COLUMN_NAME
       FROM INFORMATION_SCHEMA.COLUMNS 
       WHERE TABLE_NAME='table1') a
     JOIN table2
     ON table2.name = a.column_name
     WHERE table2.display = "1"
    ); 

SET @query = CONCAT('SELECT ', @sql, ' FROM table1');

PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQLFiddle demo