2016-06-22 8 views
0

Ich verwende PHP, um Informationen über drei MySQL-Datenbanken zu berichten und zusammenzuführen. Die Daten aus MySQL sind im Grunde:Mehrere MySQL-Ergebnisse aus PHP zusammenführen, dieselbe Sortierung/Sortierung verwenden

SELECT email, money FROM accounts ORDER BY email 

Und in PHP implementiert ich eine merge (Einfügen zum Spaß):

$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); 
} 

Dieser Algorithmus setzt voraus, dass die Sortierung in MySQL (ORDER BY email) zur Sortier identisch ist in PHP ($row->email < $minimumInput->email). Wie kann ich bestätigen, dass diese Anforderung für alle möglichen (einschließlich nicht lateinische) Eingänge erfüllt ist?

+1

'<' auf Strings macht selten Sinn. und wenn du es mit nicht-lateinisch zu tun hast (ich vermute, du meinst nicht-ascii), ist es noch schlimmer. PHP ist nicht unicode bewusst und wird Dinge viel anders als mysql vergleichen, weil php Zeichen-als-einzelne-Bytes vergleichen wird, nicht Zeichen-dass-kann-Multibyte sein. –

+0

Hier ist der letzte Code, mit dem Sie mehrere MySQL-Abfragen kombinieren und Datensätze kombinieren können, wenn sie denselben eindeutigen Schlüssel haben: https://gist.github.com/fulldecent/a4cac03087caadec4c275a54317a6f623 –

Antwort

1

Verwenden Sie ORDER BY email COLLATE utf8_bin in MySQL, so dass Sie die gleiche Reihenfolge wie in PHP erhalten, damit Ihre 'merge' funktioniert. (Zumindest denke ich, das ist eine Lösung.)

+0

Ehrfürchtig, danke! –