MySQL:从另一个表中获取表名并将其用于查询

时间:2016-01-15 11:46:37

标签: mysql

我正在为客户端 - 服务器应用程序执行同步过程。只需要同步几个表,但表的数量可能会改变,所以我决定将同步的表名存储在一个单独的表中:

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/>";
}

1 个答案:

答案 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'