我正在为客户端 - 服务器应用程序执行同步过程。只需要同步几个表,但表的数量可能会改变,所以我决定将同步的表名存储在一个单独的表中:
sync_tables:
ID | tableName
----------------
1 | table1
2 | table2
我想得到'版本'每个表的列。
表1:
ID | name | version
-----------------------
1 | n1 | 22
2 | n2 | 24
表2:
ID | name | version
-----------------------
1 | n3 | 27
2 | n5 | 29
我不想要使用
SELECT version FROM table1, table2
问题: 我该怎么做这样的事情:
SELECT version FROM [sync_tables.getTableNames]
使用PaulF的回答解决方案:
mysql_query("SELECT CONCAT('SELECT `version` FROM ',GROUP_CONCAT(tableName SEPARATOR ' UNION ALL SELECT `version` FROM ')) from sync_tables into @myVar;");
mysql_query("PREPARE stmt FROM @myVar;");
$queryResult = mysql_query("EXECUTE stmt;");
mysql_query("DEALLOCATE PREPARE stmt;");
if( $queryResult )
{
while($row = mysql_fetch_assoc($queryResult))
{
foreach($row as $cname => $cvalue)
{
print "$cname: $cvalue <br/>";
}
}
}
else
{
echo "query returned empty<br/>";
}
答案 0 :(得分:2)
由于列名不明确,您的第一个查询会导致错误,但如果您使用完全限定列名,则会导致交叉连接,从表中提供每个可能的版本号组合。
您需要使用联合 - 因此查询将是
SELECT version FROM table1
UNION ALL
SELECT version FROM table2
MySQL不允许将表名作为变量包含在查询中 - 因此您不想编写固定查询,而是使用其他查询的结果 - 您需要构建一个字符串创建完整的查询&amp;然后将该查询作为准备语句运行:请参阅此处的文档http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
可以提取sync_table中的表名称&amp;使用GROUP_CONCAT函数组合成一个逗号分隔的字符串。可以使用CONCAT&amp; amp; REPLACE函数用于创建所需的查询&amp;然后作为准备好的声明执行如下:
SELECT GROUP_CONCAT(tablename) from sync_tables into @var;
SELECT CONCAT('SELECT `version` FROM ',REPLACE( @var, ',', ' UNION ALL SELECT `version` FROM ' )) INTO @var2;
PREPARE stmt FROM @var2;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
前两行可以合并为
SELECT CONCAT('SELECT `version` FROM ',GROUP_CONCAT(tablename SEPARATOR ' UNION ALL SELECT `version` FROM ') from sync_tables into @var2;
注意'使用UNION ALL'而不仅仅是'UNION',因此不会省略重复项,如果你不想重复,那么就会错过'ALL'