Сравнение данных между двумя таблицами MySQL с помощью PHP - PullRequest
2 голосов
/ 06 января 2010

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

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

Пример:

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

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

и table2:

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

тогда будет вывод:

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

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

Ответы [ 5 ]

4 голосов
/ 06 января 2010

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

EDIT

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

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
    ...
4 голосов
/ 06 января 2010
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>
0 голосов
/ 29 апреля 2013

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

$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 голосов
/ 06 января 2010
SELECT table2.user_name FROM table2 LEFT JOIN table1 ON table1.user_id = table2.user_id WHERE table1.user_name != table2.user_name

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

0 голосов
/ 06 января 2010

Я думаю, что лучше использовать для этого 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...