Сравнение данных между двумя таблицами MySQL с PHP

У меня две таблицы table1 = records, table2 = duplicates. Обе таблицы содержат переменное количество столбцов в любой момент времени, и оба они содержат одинаковые столбцы, за исключением table2 имеющей дополнительный столбец ID … Обе таблицы содержат столбец user_id . Данные поступают из импорта CSV. Если user_id уже существует в table1 он вставляется в table2 .

С table2 мне нужно иметь возможность захватить все строки и распечатать их в таблице, без проблем. Часть, с которой мне сложно разобраться … Для каждого столбца table2 который печатается, мне нужно проверить, соответствуют ли данные (на основе user_id ) данные в table1 и каким-то образом user_id это … (возможно, другой цвет фона на ячейке таблицы)

Пример:

table1 содержит строку:

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

и table2 :

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

то выход будет:

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

Любая идея о том, как я могу сделать эту работу? Если это помогает, я создаю это приложение с помощью Codeigniter.

Этот запрос будет выбирать все записи из таблицы2, а если имя отличается от имени в is_different , is_different будет равным 1, в противном случае оно равно 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 

РЕДАКТИРОВАТЬ

Вы можете выполнить несколько тестов в одном запросе, если вам нужно сравнить более одного столбца:

 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 ... 
 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 

то ваш скрипт может проверить все поля, которые вы хотите сравнить, и, при необходимости, напечатать 2 значения рядом друг с другом.

вы можете распечатать каждую возвращенную запись и в соответствии с несоответствиями напечатать вторую строку, содержащую исходные значения для простого сравнения:

 <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> 

Я думаю, что лучше всего использовать для этого SQL-запрос. Например:

 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 
 SELECT table2.user_name FROM table2 LEFT JOIN table1 ON table1.user_id = table2.user_id WHERE table1.user_name != table2.user_name 

Используйте это простое соединение. PHP не должен беспокоиться о выборе и заказе данных, ваша РСУБД выполняет эту работу.

Я думаю, что лучший способ

 $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"; }