2010-01-06 5 views
2

J'ai deux tables table1 = enregistrements, table2 = doublons. Les deux tables contiennent un nombre variable de colonnes à un moment donné et elles contiennent toutes les deux exactement les mêmes colonnes à l'exception de table2 ayant une colonne supplémentaire ID ... Les deux tables contiennent une colonne, user_id. Les données proviennent d'une importation CSV. Si le user_id existe déjà dans table1, il est inséré dans table2.Comparaison de données entre deux tables MySQL avec PHP

Avec table2 Je dois être en mesure de saisir toutes les lignes et les imprimer dans un tableau, pas de problème. La partie que j'ai du mal à comprendre ... Pour chaque colonne en table2 qui est imprimée, je dois vérifier si les données correspondent (sur la base du user_id) aux données en table1 et en quelque sorte le marquer ... (peut-être un différent fond coloré sur la cellule du tableau)

Exemple:

table1 contient la ligne:

user_id | user_name 
------------------- 
2342342 | some name 

et table2:

user_id | user_name 
------------------- 
2342342 | different name 

alors la sortie serait:

----------------------------------------- 
|2342342 | *flag* different name *flag* | 
----------------------------------------- 

Toute idée de comment je pourrais faire ce travail? Si ça aide, je construis cette application avec Codeigniter.

Répondre

4

Cette requête sélectionnera toutes les entrées de table2, et si le nom est différent du nom dans le tableau 1, is_different sera 1, sinon il est 0:

SELECT 
    table2.user_name, 
    IF(table2.user_name != table1.user_name, 1, 0) AS is_different 
FROM 
    table2 
LEFT JOIN 
    table1 
ON 
    table1.user_id = table2.user_id 

EDIT

Vous peut faire plusieurs de ces tests dans une requête, si vous avez besoin de comparer plus d'une colonne:

SELECT 
    table2.user_name, 
    table2.user_email, 
    IF(table2.user_name != table1.user_name, 1, 0) AS is_name_different, 
    IF(table2.user_email != table1.user_email, 1, 0) AS is_email_different 
FROM 
    ... 
+0

C'est vraiment proche de ce que j'essaie de faire! à l'exception de ... J'ai juste besoin de savoir si la colonne "is_different" - de cette façon je peux simplement mettre en surbrillance juste "user_name" (ou toute autre colonne) est-ce possible? Une autre chose, le nombre de pourrait changer à tout moment, suggérez-vous de construire la requête avec php en premier ou y a-t-il un moyen de faire "IF (table2.user_name! = Table1.user_name, 1, 0) AS is_different" pour chaque colonne dynamiquement avec mysql? Merci beaucoup! – mike

+0

Si je vous ai bien compris; bien sûr, vous pouvez comparer toutes les colonnes avec la même méthode. La seule chose qui compte est que les ID des lignes comparées sont égaux (évidemment). J'ai édité ma réponse pour vous montrer comment ajouter plusieurs tests dans une requête. –

+0

ah ... je vois, c'est parfaitement logique maintenant. Merci! – mike

0

Je pense qu'il est préférable d'utiliser une requête sql pour cela. Par exemple:

SELECT 
table2.*, 
CASE WHEN table2.user_name = table1.user_name THEN 'No flag' ELSE 'Flag' END CASE AS FLAG 
FROM 
table2 
LEFT JOIN table1 
ON table1.user_name = table2.user_name 
+0

Ne devrait pas se joindre à user_id? – erenon

4
select b.user_id, b.user_name, b.something, b.something2, 
a.user_id as a_user_id, a.user_name as a_user_name, 
a.something as a_something, a.something2 as a_something2 
from b left join a on a.user_id = b.user_id 

alors votre script peut vérifier tous les champs que vous souhaitez comparer et éventuellement imprimer 2 valeurs côte à côte.

vous pouvez imprimer chaque enregistrement retourné, et sous les discordances, imprimer une seconde ligne contenant les valeurs d'origine pour faciliter la comparaison:

<style type="text/css"> 
tr.good td {background: #fff; color: #333;} 
tr.bad td {background: #aaa; color: #fff;} 
tr.compare td {background: #000; color: #fff;} 
td.match {} 
td.mismatch {background: #ff0000; color: #fff;} 
</style> 

<table> 
<tr><th>user id</th><th>name</th><th>something</th><th>something2</th></tr> 

<?php 
    function tdClass($k, $matches) { 
    return isset($matches[$k]) && !$matches[$k] ? 'mismatch' : 'match'; 
    } 

    foreach ($rows as $r) { 
    $good = true; 
    $matches = array(); 
    foreach ($r as $k => $v) { 
     $matches[$k] = isset($r["a_$k"]) && $r["a_$k"] === $v; 
     if (!$matches[$k]) $good = false; 
    } 
    $url = "user/$row[user_id]"; 
?> 

<tr class="<?php echo $good ? 'good' : 'bad' ?>"> 

<td><?php echo $row['user_id'] ?></td> 

<td class="<?php echo tdClass('user_name', $matches) ?>"> 
    <a href="$url"><?php echo htmlentities($row['user_name']) ?></a></td> 

<td class="<?php echo tdClass('something', $matches) ?>"> 
    <?php echo htmlentities($row['something']) ?></td> 

<td class="<?php echo tdClass('something2', $matches) ?>"> 
    <?php echo htmlentities($row['something2']) ?></td> 

</tr> 

<?php if (!$good) { ?> 

<tr class="compare"> 
<td></td> 
<td><a href="$url"><?php echo htmlentities($row['a_user_name']) ?></a></td> 
<td><?php echo htmlentities($row['a_something']) ?></td> 
<td><?php echo htmlentities($row['a_something2']) ?></td> 
</tr> 

<?php } ?> 

</tr> 
</table> 
+0

très détaillé ... merci!maintenant pour savoir quelle route prendre ... – mike

0
SELECT table2.user_name FROM table2 LEFT JOIN table1 ON table1.user_id = table2.user_id WHERE table1.user_name != table2.user_name 

Utilisez cette simple jointure. PHP ne devrait pas se soucier de la sélection et de la commande des données, vos SGBDR font le travail.

0

Je pense que la meilleure façon s

$table1 = mysql_query_return_array("DESCRIBE `table1`")<br> 

$table2 = mysql_query_return_array("DESCRIBE `table2`")<br> 

if(json_encode($table1) == json_encode($table2) ){ 
    echo "there is different"; 

}else{ 
    echo "they are same"; 
} 
+0

Ne pas utiliser 'mysql', utilisez' mysqli' à la place – Luke

Questions connexes