我想指定使用子查询选择哪些列;这在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 |
+-------------------+
答案 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;