gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:17:56 26 4
gpt4 key购买 nike

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

同步表:

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]

SOLUTION 使用 PHP 通过使用 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/>";
}

最佳答案

由于列名不明确,您的第一个查询会导致错误,但如果您使用完全限定的列名,则会导致交叉连接,给出表中版本号的所有可能组合。

您需要使用联合 - 所以查询将是

SELECT version FROM table1
UNION ALL
SELECT version FROM table2

MySQL 不允许将表名作为变量包含在查询中 - 因此您不想编写固定查询,而是使用另一个查询的结果 - 您需要构建一个字符串以创建完整的查询,然后将查询作为准备好的语句运行:请参阅此处的文档 http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html

可以使用 GROUP_CONCAT 函数将 sync_table 中的表名提取并组合成一个逗号分隔的字符串。可以使用 CONCAT 和 REPLACE 函数修改生成的字符串以创建所需的查询,然后作为准备语句执行,如下所示:

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”

关于MySQL:从另一个表中获取表名并将其用于查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34810380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com