如何从动态表名中进行选择

6

我有类似下面的表格:

changes201101
changes201102
changes201103
...
changes201201

有一个表whichchanges,其中包含了年份和月份两个列。

我该如何从whichchanges选择所有行?

我的查询语句如下:

SET @b := SELECT CONCAT('changes',year,month) FROM whichchanges;
((((@b should contain now multiple rows of changesYearMonth)))))
SET @x := SELECT * FROM @b;
Prepare stmt FROM @b;
Prepare stmt FROM @x;
Execute stmt;

#1064 - 您的SQL语法存在错误;请检查与您的MySQL服务器版本相对应的手册,以了解在第1行附近使用的正确语法。

1
看起来你编辑了你的问题。现在查询与你的错误信息不符了。 - juergen d
1个回答

7

您打开了一个左括号( 但只关闭了两个右括号)。请删除最后一个:

SELECT CONCAT('changes',year,month) FROM changes

编辑

第二个语句可能应该是

SET @x := SELECT * FROM (@b) as b;

那个方法可行,但不确定那是否是你想要的:
SET @b := 'SELECT CONCAT(''changes'',`year`,`month`) FROM whichchanges';
SET @x := 'SELECT * FROM (SELECT CONCAT(''changes'',`year`,`month`) FROM whichchanges) as b';
Prepare stmt FROM @b;
Prepare stmt FROM @x;
Execute stmt;

编辑2

如果我理解正确,您正在寻找这个单一查询:

select * from changes
where change_column in (select distinct concat(`year`, `month`) from whichchanges)

编辑3

select @b := group_concat(concat(' select * from changes', `year`, `month`, ' union ') separator ' ') as w from whichchanges;
set @b := left(@b, length(@b) - 6);

Prepare stmt FROM @b;
Execute stmt;

SQLFiddle 示例


`SET @b = SELECT CONCAT('change',year,month) FROM whichchanges; SET @x := SELECT * FROM (@b); Prepare stmt FROM @b; Prepare stmt FROM @x; Execute stmt;#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT CONCAT('changes',year,month) FROM whichchanges' at line 1` - breq
我希望这能帮到你 http://i.imgur.com/hni0g.jpg 如果不行,我会用PHP来做。 - breq
@jurgen-d,是的,它必须在一个查询中,但是你查询中的“change_column”是什么意思? 我认为查询应该像这样:“select * from changes where changes in (select distinct concat('changes ',yer, month) from whichchanges)”#1146 - 表'database.changes'不存在 - breq
1
@breq:看一下我的最新更新,其中包含这个例子。 - juergen d
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接