2016-06-22 6 views
0

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)。この要件が、非ラテンのの入力を含むすべての可能な入力()に対して満たされていることを確認するにはどうすればよいですか?

+1

文字列の '<'はほとんど意味がありません。あなたが非ラテン(私はあなたがnon-asciiを意味すると推測している)を扱っているなら、それはさらに悪いことです。 PHPはUnicode対応ではなく、MySQLとは多少の違いを比較します。なぜなら、phpはマルチバイト文字ではなく文字を単一バイトとして比較するからです。 –

+0

複数のmysqlクエリを組み合わせて、同じユニークキーを持つレコードを組み合わせるための最終的なコードは次のとおりです。https://gist.github.com/fulldecent/a4cac03087cadec4c1275a54317a6f623 –

答えて

1

ORDER BY email COLLATE utf8_binをMySQLで使用すると、PHPと同じ順序が得られ、それによって「マージ」作業が可能になります。 (少なくとも、これは解決策だと思います)。

+0

ありがとうございます! –

関連する問題