2010-12-10 31 views
1

Un fournisseur nous envoie un fichier CSV de ses produits. Une colonne particulière sur le fichier (par exemple la colonne 3) est le numéro de style. Ce fichier contient des milliers d'entrées.Un moyen efficace de trouver quelles valeurs dans CSV ne sont pas dans DB?

Nous avons un tableau de base de données de produits avec une colonne appelée manufacturer_num qui est le numéro de style des fournisseurs.

Je dois trouver lequel des produits du fournisseur nous n'avons pas actuellement.

Je sais que je peux lancer en boucle chaque ligne dans le fichier CSV et extraire le numéro de style et vérifier si c'est dans notre base de données. Mais alors je fais un appel à la base de données pour chaque ligne. Ce serait des milliers d'appels à la base de données. Je pense que c'est inefficace.

Je pourrais également construire une liste des numéros de style (soit en tant que chaîne ou tableau) pour faire un appel de DB. Quelque chose comme: WHERE manufactuer_num IN(...) Mais PHP ne manquera-t-il pas de mémoire si la liste est trop grande? Et en fait, cela me donnerait ceux que nous avons, pas ceux que nous n'avons pas.

Quel est un moyen efficace de le faire?

+1

Je testerais l'approche stupide-évidente avant que je m'inquiète de l'optimiser. Vous dites "des milliers d'entrées". Pris à l'extrême illogique de 999999 entrées, il pourrait bien être ridicule. Si nous allons quelque part plus raisonnable - comme 10 000 entrées - je m'attends à ce que cela prenne (significativement) moins de 30 secondes, et je doute que cela vous intéresse plus. –

Répondre

6

Bulk charger le fichier CSV dans une table temporaire, faire un LEFT JOIN, puis obtenir les enregistrements où le RHS de la jointure est NULL.