PHPを使用して3つのMySQLデータベース間で情報をマージし報告します。 MySQLのデータは、基本的には、次のとおりです。PHPからの複数のMySQL結果をマージし、同じ照合/ソートを使用
SELECT email, money FROM accounts ORDER BY email
そしてPHPで私がマージ(楽しみのために貼り付け)を実装:
$inputs = array(); // Elements of ['row'=>array, 'statement'=>PDOStatement]
while (count($inputs) > 0) {
$minimumInput = NULL;
$currentOutput = new OutputRow();
// Find minimum input
foreach ($inputs as $input) {
list($row, $statement) = $input;
if (is_null($minimumInput) || $row->email < $minimumInput->email) {
$minimumInput = $input['row'];
}
}
// Merge all matching inputs
$currentInput = 0;
do {
if ($inputs[$currentInput]['row']->email === $minimumInput->email) {
mergeDataToOutputRow($currentOutput, $inputs[$currentInput]['row']);
$fetch = $inputs[$currentInput]['statement']->fetch(PDO::FETCH_OBJ);
if ($fetch === FALSE) {
array_splice($inputs, $currentInput, 1); // that input is exhausted
} else {
$inputs[$currentInput]['row'] = $fetch;
}
} else {
$currentInput++;
}
} while ($currentInput < count($inputs));
// None of the inputs now match CURRENTOUTPUT
output($currentOutput);
}
このアルゴリズムは、MySQL(ORDER BY email
)でのソートはソートと同一であることが必要ですPHPで($row->email < $minimumInput->email
)。この要件が、非ラテンのの入力を含むすべての可能な入力()に対して満たされていることを確認するにはどうすればよいですか?
文字列の '<'はほとんど意味がありません。あなたが非ラテン(私はあなたがnon-asciiを意味すると推測している)を扱っているなら、それはさらに悪いことです。 PHPはUnicode対応ではなく、MySQLとは多少の違いを比較します。なぜなら、phpはマルチバイト文字ではなく文字を単一バイトとして比較するからです。 –
複数のmysqlクエリを組み合わせて、同じユニークキーを持つレコードを組み合わせるための最終的なコードは次のとおりです。https://gist.github.com/fulldecent/a4cac03087cadec4c1275a54317a6f623 –