2011-01-08 6 views
0

J'essaie de corriger certaines données en ajoutant un nouveau champ.MySQL Comment joindre et sélectionner des enregistrements visibles d'une table?

J'ai une sauvegarde depuis quelques mois et j'ai restauré cette base de données sur mon serveur.

Je regarde la table appelée pads, sa clé primaire est PadID et le champ d'importance s'appelle RemoveMeDate. Dans ma base de données restaurée (plus ancienne), il y a moins d'enregistrements avec une date réelle définie dans RemoveMeDate. Ma date de contrôle est 2001-01-01 00:00:00 ce qui signifie que l'enregistrement n'est pas caché ou visible. Ce que je dois faire est de sélectionner tous les enregistrements de l'ancienne base de données/table avec la date de contrôle et joindre avec ceux de la plus récente db/table où la date de contrôle n'est pas définie.

J'espère avoir expliqué cela correctement.

Je vais essayer à nouveau, avec des chiffres. J'ai 80 000 enregistrements visibles dans l'ancienne table (avec le jeu de date de contrôle) et 30 000 dans le plus récent db/table. Je dois sélectionner les 50 000 de l'ancienne base de données, pour effectuer une requête de mise à jour.

Voici ma requête, que je ne pourrais pas utiliser comme je le souhaite. jules-fix-raisons est l'ancienne base de données, jules est la plus récente.

select p.padid 
from `jules-fix-reasons`.`pads` p 
JOIN `jules`.`pads` ON p.padid = `jules`.`pads`.`PadID` 
where p.RemoveMeDate <> '2001-01-01 00:00:00' AND 
`jules`.`pads`.RemoveMeDate =  '2001-01-01 00:00:00' 

EDIT - Peut-être que je peux fournir un exemple, au lieu de 10 000 enregistrements, je vais montrer 1 exemple.

p.pads (old table) 
PadID=1 RemoveMeDate=2010-12-01 09:00:00 
PadID=2 RemoveMeDate=2001-01-01 00:00:00 
PadID=3 RemoveMeDate=2001-01-01 00:00:00 
PadID=4 RemoveMeDate=2001-01-01 00:00:00 
PadID=5 RemoveMeDate=2001-01-01 00:00:00 
PadID=6 RemoveMeDate=2001-01-01 00:00:00 
PadID=7 RemoveMeDate=2001-01-01 00:00:00 
PadID=8 RemoveMeDate=2001-01-01 00:00:00 
PadID=9 RemoveMeDate=2001-01-01 00:00:00 
PadID=10 RemoveMeDate=2009-01-05 00:10:00 

Donc theres 8 (aks = 80,000 dans la table réelle) enregistrements visibles.

Jules.pads 
PadID=1 RemoveMeDate=2010-12-01 09:00:00 
PadID=2 RemoveMeDate=2010-12-01 08:00:00 
PadID=3 RemoveMeDate=2010-12-01 07:00:00 
PadID=4 RemoveMeDate=2010-12-01 06:00:00 
PadID=5 RemoveMeDate=2001-01-01 00:00:00 
PadID=6 RemoveMeDate=2001-01-01 00:00:00 
PadID=7 RemoveMeDate=2001-01-01 00:00:00 
PadID=8 RemoveMeDate=2001-01-01 00:00:00 
PadID=9 RemoveMeDate=2001-01-01 00:00:00 
PadID=10 RemoveMeDate=2009-01-05 00:10:00 

Donc, 5 enregistrements (aks = 50 000 dans la table réelle) sont visibles.

Ainsi, la requête SQL Je veux reviendriez enregistrements 2,3,4 de la table P

Modifier ajreal - requête de travail (FYI)

SELECT old_table.padid 
FROM `jules-fix-reasons`.`pads` AS old_table 
JOIN `jules`.`pads` AS new_table ON old_table.padid = new_table.`PadID` 
WHERE new_table.RemoveMeDate <> '2001-01-01 00:00:00' 
AND old_table.RemoveMeDate = '2001-01-01 00:00:00' 
+0

Qu'est-ce que vous obtenez lorsque vous exécutez cela? –

+0

Je n'obtiens aucun résultat. – Jules

+0

J'ai ajouté quelques exemples de données – Jules

Répondre

1

Ce que je dois faire est de sélectionner tous les enregistrements de l'ancienne base de données/table avec la date de contrôle et joindre à ceux de la plus récente db/table où la date de contrôle n'est pas définie.

il vous suffit de retourner la condition

select old_table.padId, new_table.padId 
from `jules-fix-reasons`.`pads` as old_table 
JOIN `jules`.`pads` as new_table 
ON old_table.padid = `jules`.`pads`.`PadID` 
where new_table.RemoveMeDate<>'2001-01-01 00:00:00' AND 
old_table.RemoveMeDate='2001-01-01 00:00:00' 

PS: est temps d'apprendre comment donner un bon nom pour votre alias de table

+0

J'ai essayé d'ajouter un alias pour l'autre table mais cela n'a pas fonctionné. Je pense que cela fonctionne, mais je suis un peu perplexe. Votre requête renvoie 54 180 enregistrements. L'ancienne table contient 83 132 enregistrements et la nouvelle table 30 834. Si je moins vieux de nouveau, je reçois 52 298. Je ne suis pas sûr pourquoi il y a une différence, des idées? Que dit la logique? – Jules

+0

Il se peut que certains de vos enregistrements se chevauchent, essayez 'select count (*) from old_table où RemoveMeDate = '?';' Et 'select count (*) from new_table où RemoveDate <> '?'; ' – ajreal

+0

Point d'interrogation? qui renvoie zéro sur les deux tables. – Jules

Questions connexes