我有50个具有相同设计和结构的数据库。为了对其中包含的数千个变量进行基准数据分析和评估,我需要构建SQL查询。我有一个SuperAdmin帐户,该帐户有权通过SSH访问来查看所有这些数据库。
现在,我可以使用UNION ALL这样(简化)来编写将一个数据库与另一个数据库的数据合并在一起的SQL查询:
SELECT * FROM db1.table WHERE blah
UNION ALL
SELECT * FROM db2.table WHERE blah
UNION ALL
[...]
SELECT * FROM db50.table WHERE blah
这些查询都在PHP环境中,并且像超级按钮一样工作-我得到了所有想要的数据分析和评估。
但是:
在我的情况下,单个SQL查询包含约1.000行查询语句和条件代码。以这种顺序的方式查询50个数据库意味着我的查询变得很大,并且每次复制一次SQL语句(将“ db1”调整为“ db50”)以及很多JOIN语句时,我都不得不做很多容易出错的事情。变得无处可去,变得费时。
我的问题:
没有一种方法可以告诉PHP将所有“ dbx”放入数组中,然后通过使用foreach或while或将“ dbx”从1交换为50来仅重申一个基本的SQL查询。类似的说法?
例如:
<?php
function getResultValuesFromDatabase() {
global $DATABASE;
$db1 = "database1";
$db2 = "database2";
[...]
$db50 = "database50";
$no_of_databases = array($db1, $db2, [...], $db50);
foreach ($no_of_databases as $value) {
$sql_query = "SELECT * FROM $value.table WHERE blah";
}
$rQuery = mysql_query($qQuery, $oDatabase);
$result = array("count" => mysql_num_rows($rQuery ), "result" => $rQuery);
return $result;
}
我收到一个影响重复过程的错误。有人可以告诉我我的逻辑错误在哪里吗?
答案 0 :(得分:3)
您不需要名称数组。由于它们都很相似,因此一个简单的for
循环应该可以为您工作。您还需要在循环中进行查询并累积结果,然后再返回它们。
for ($db = 1;$db <= 50;$db++) {
$sql_query = 'SELECT * FROM database' . str_pad($db,2,'0',STR_PAD_LEFT) . '.table WHERE blah';
$rQuery = mysql_query($qQuery, $oDatabase);
$result[] = array("count" => mysql_num_rows($rQuery ), "result" => $rQuery);
}
return $result;
答案 1 :(得分:1)
当然可以,但是在执行任何请求之前必须更改数据库。
另外,请注意,mysql_*
函数已被弃用,您必须考虑将其更改为mysqli
或PDO
。
这是您的方法:
function getResultValuesFromDatabase()
{
$result = [];
$con = mysqli_connect("localhost","my_user","my_password");
for ($i = 1; $i <= 50; $i++) {
$databaseName = 'database' . str_pad($i, 2, '0', STR_PAD_LEFT);
mysqli_select_db($con, $databaseName);
// Probably the database doesn't exist
if (mysqli_errno($con) !== 0) {
continue;
}
$queryResult = mysqli_query($con, "SELECT * FROM table WHERE blah");
$result[$databaseName] = [
'count' => mysqli_num_rows($queryResult),
'result' => mysqli_fetch_all($queryResult, MYSQLI_ASSOC)
];
mysqli_free_result($queryResult);
}
mysqli_close($con);
return $result;
}