2010-12-10 10 views
1

Ein Lieferant füttert uns eine CSV-Datei ihrer Produkte. Eine bestimmte Spalte in der Datei (z. B. Spalte 3) ist die Stilnummer. Diese Datei enthält Tausende Einträge.Effiziente Weise, um zu finden, welche Werte in CSV NICHT in DB sind?

Wir haben eine Datenbanktabelle von Produkten mit einer Spalte namens herstellernummer, die die Lieferantenstilnummer ist.

Ich muss herausfinden, welche der Produkte des Anbieters wir derzeit nicht haben.

Ich weiß, ich kann Schleife jede Zeile in der CSV-Datei werfen und die style_number extrahieren und überprüfen, ob es in unserer Datenbank ist. Aber dann rufe ich für jede Zeile die Datenbank an. Das wären tausende Aufrufe an die Datenbank. Ich denke, das ist ineffizient.

Ich könnte auch eine Liste der Stilnummern (entweder als String oder Array) erstellen, um einen DB-Aufruf zu machen. So etwas wie: WHERE manufactuer_num IN(...) Aber wird PHP nicht zu wenig Speicher haben, wenn die Liste zu groß ist? Und das würde mir tatsächlich diejenigen geben, die wir haben, nicht diejenigen, die wir nicht haben.

Was ist eine effiziente Möglichkeit, dies zu tun?

+1

Ich würde den dümmlich-offensichtlichen Ansatz testen, bevor ich mich darum kümmerte, ihn zu optimieren. Sie sagen "Tausende von Einträgen". Betrachtet man das unlogische Extrem von 999.999 Einträgen, könnte es durchaus lächerlich sein. Wenn wir etwas Vernünftigeres - wie 10.000 Einträge - gehen, erwarte ich, dass es (signifikant) weniger als 30 Sekunden dauern würde. An diesem Punkt bezweifle ich, dass es dir egal ist. –

Antwort

6

Laden Sie die CSV-Datei in eine temporäre Tabelle, führen Sie eine LEFT JOIN aus und rufen Sie dann die Datensätze ab, bei denen der RHS der Verknüpfung NULL ist.

Verwandte Themen