2011-03-29 4 views
1

J'ai trois tables sous forme de vidage SQLITE3.Comparaison de plusieurs tables Mysql pour trouver des enregistrements modifiés

produits, taxe, inventaire

A partir de ces tables préparent un fichier csv à importer dans la section des produits. Magento SO cette partie est terminée.

Maintenant, vous devez exécuter un script quotidien qui met à jour l'inventaire, la taxe, les détails du produit modifié (SKU ne changera en aucun cas).

Dans cette section de mise à jour. Par exemple, j'ai 12000 enregistrements, en ce sens que seuls 400 ou 1000 enregistrements peuvent être modifiés/modifiés/mis à jour dans la table d'inventaire, la table des taxes, la table des produits de la base de données du dernier jour. Les lignes restantes resteront les mêmes.

J'ai donc ajouté les tables des derniers jours comme old_products, old_tax, old_inventory.

et a essayé d'écrire requête SQL pour extraire uniquement les enregistrements modifiés à partir des deux séries de tableaux

(Note:. Les deux ensembles de tables disponibles en même Db)

S'il vous plaît quelqu'un peut me aider comment écrire une requête sql pour extraire les enregistrements modifiés en comparant deux ensembles de tables.

Répondre

1

je ne serais probablement changer ce schéma.

Je voudrais avoir une table où je stocker la date (s) lors de ma dernière a exporté les données au format CSV (s):

CREATE TABLE CSVLastExported (
    ProductsExportDate datetime, 
    TaxExportDate datetime, 
    InventoryExportDate datetime 
) 

Et je pourrais alors une colonne d'horodatage dans chacun des trois tables qui contiendraient l'horodatage de la dernière modification. J'aurais un déclencheur pour mettre à jour cette colonne.

Interrogation des données modifiées pour une autre exportation serait alors aussi facile que de comparer la colonne LastModified contre la colonne correspondante CSVLastExported:

SELECT p.* 
FROM products p 
    INNER JOIN CSVLastExport e 
    ON p.LastModified > e.ProductsExportDate 
1

cela vous donne toutes les modifications (et produit):

select * from products p inner join old_products o on p.id = o.id 

et ce les produits modificated:

select * from products where id in (select id old_products) 
+0

Il me semble de la façon dont je lis la question, les tables de travail contiennent toujours toutes les lignes Ils ne diffèrent de leurs homologues 'old_' que par le fait que * certaines * des lignes sont modifiées. Et le sous-ensemble modifié est ce que l'OP veut extraire de chacun d'entre eux. –

+0

@andry .. exactement. Tu as raison. C'est ce que je dois faire ici. Et le vieux db a 8 tables aussi le nouveau db a 8. Donc c'est difficile pour moi d'écrire les requêtes de jointure correctement. Va travailler et poster ma réponse ici. – Elamurugan

Questions connexes