我有一个保存表日志的数据库 - 每个日志 id 都是数字 有匹配的表要加入,这些表是 NAMED 日志 + 数字 logId
我需要能够根据将要传递的日志 ID 加入这些表
例如:SELECT * from ACTIVITIES a INNER JOIN (LOG + LogID) l2 ON a.activityID = l2.activityID
'logID' 将作为参数传递所以如果 logID 为 100 我正在寻找表 log100
我怎样才能做到这一点?
我有一个保存表日志的数据库 - 每个日志 id 都是数字 有匹配的表要加入,这些表是 NAMED 日志 + 数字 logId
我需要能够根据将要传递的日志 ID 加入这些表
例如:SELECT * from ACTIVITIES a INNER JOIN (LOG + LogID) l2 ON a.activityID = l2.activityID
'logID' 将作为参数传递所以如果 logID 为 100 我正在寻找表 log100
我怎样才能做到这一点?
SQL 要求在将查询传递给prepare()
. 您不能使用参数作为表名。不是表名的一部分,也不是整个表名。
因此,您必须在应用程序代码中的变量中形成表名,然后在 SQL 查询中使用该变量。
示例(伪代码,如 PHP):
$logid = 100;
$tablename = "log{$logid}";
$sql = "SELECT * from ACTIVITIES a INNER JOIN `{$tablename}` l2 ON a.activityID = l2.activityID";
$stmt = $dbh->prepare($sql);
我鼓励您查看 MySQL 的表分区功能。您也许可以避免拥有如此多的日志表,而只需将它们视为整个表中的单独分区。
您必须使用动态 sql 语句才能对动态表执行查询。
将日志 ID 作为参数,创建一个接受一个参数的存储过程:
创建过程 usp_GetTableLogs @logID int
作为
声明 @select varchar(2000)
SET @select = 'SELECT * from ACTIVITIES a INNER JOIN LOG' + @logID + 'l2 ON a.activityID = l2.activityID'
执行 (@select)
:)