2017-10-09 1 views
0

Ich möchte Zeilen in einer Tabelle mit Zeilen in einer anderen Tabelle übereinstimmen und jede Zeile sollte nur einmal übereinstimmen. Ich habe die folgende Abfrage konstruiert, die in jeder anderen Hinsicht funktioniert, außer dass ich es nicht weiter optimieren kann, so dass eine Zeile nur einmal ausgewählt werden kann.Ich möchte Zeilen in einer Tabelle mit Zeilen in einer anderen Tabelle übereinstimmen und jede Zeile sollte nur einmal übereinstimmen

try{$results_pref_school1 = $db->query('SELECT mps.mps_client_ec_no, mcs.mcs_client_ec_no, mps.mps_school_id, mcs.mcs_school_id 
              FROM match_pref_schools AS mps 
              INNER JOIN match_current_schools AS mcs 
              ON mps.mps_school_id = mcs.mcs_school_id 
              AND mcs.mcs_id IN (SELECT MIN(mcs.mcs_id) 
                   FROM match_current_schools AS mcs 
                   GROUP BY mcs.mcs_school_id) 
              ORDER BY mcs.mcs_id'); 
}catch (Exception $e){ 
     echo 'Failed to retrieve matched preferred school'; 
     exit; 

} 
$matched_school = $results_pref_school1->fetchAll(PDO::FETCH_ASSOC); 

A var_dump von $ matched_school produziert:

Array 
(

[1] => Array 
    (
     [mps_client_ec_no] => REG5 
     [mcs_client_ec_no] => GL98888 
     [mps_school_id] => 6 
     [mcs_school_id] => 6 
    ) 

[2] => Array 
    (
     [mps_client_ec_no] => TAS4752 
     [mcs_client_ec_no] => ALF1252 
     [mps_school_id] => 14 
     [mcs_school_id] => 14 
    ) 

[3] => Array 
    (
     [mps_client_ec_no] => MAP002 
     [mcs_client_ec_no] => ALF1252 
     [mps_school_id] => 14 
     [mcs_school_id] => 14 
    ) 

) 

In dem obigen Ergebnis ich ALF1252 wollte nur einmal abgestimmt werden.

Antwort

0

@Parts Hoffnung ist dies hilfreich für Ihre Anfrage

in dieser i Indexschlüssel für entfernen hinzugefügt „Verwenden wo anschlagen Mit Puffer (Block Nested Loop)“, und fügen Sie einen entsprechenden Datensätze und Ihre Abfrageleistung ist jetzt am besten.

QUERY:

SELECT mps.mps_client_ec_no,mps.mps_school_id, mcs.mcs_client_ec_no, mcs.mcs_school_id 
              FROM match_pref_schools AS mps INNER JOIN match_current_schools AS mcs 
              ON mps.mps_school_id = mcs.mcs_school_id 
              where mcs.mcs_id IN (SELECT MIN(mcs.mcs_id) 
                   FROM match_current_schools AS mcs 
                   GROUP BY mcs.mcs_school_id) 
              ORDER BY mcs.mcs_id 

Index:

KEY `mcs-key` (`mcs_school_id`,`mcs_id`,`mcs_client_ec_no`) 

KEY `mps-key` (`mps_school_id`,`mps_client_ec_no`) 

INSERT INTO match_current_schools (mcs_id, mcs_client_ec_no, mcs_school_id, mcs_distr_id, mcs_province_id, mcs_client_level_taught, mcs_sub1_id, mcs_sub2_id) WERTE (6, 'XYZ', 1, 27, 3, 'HIGHSCHOOL - A LEVEL', 1, 9);

Check hier: http://sqlfiddle.com/#!9/c4103d/2

+0

http://sqlfiddle.com/#!9/f47c7/1 – Parts

+0

@kuldeed. Ich änderte meine Tabellen und fragte wie empfohlen, aber ich bekomme immer noch die gleichen Ergebnisse. Überprüfen Sie hier: http://sqlfiddle.com/#!9/8098cb/1 – Parts

+0

@Parts Ende des Ergebnisses, was Sie ausgeben möchten? Bitte sagen Sie mir –

Verwandte Themen