2010-01-06 4 views
2

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

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

ответ

4

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

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

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

Это действительно близко к тому, что я пытаюсь сделать! за исключением ... Я просто должен быть в состоянии сказать, может ли этот столбец «is_different» - так я могу просто выделить просто «имя пользователя» (или любой другой столбец), это даже возможно? Другое дело, что число может измениться в любое время, предложите ли вы сначала создать запрос с помощью php или есть ли способ сделать «IF (table2.user_name! = Table1.user_name, 1, 0) AS is_different» для каждого столбца динамически с mysql? большое спасибо! – mike

+0

Если я правильно понял вас; Конечно, вы можете сравнить любые столбцы с тем же методом. Единственное, что имеет значение, это то, что идентификаторы сравниваемых строк равны (очевидно). Я отредактировал свой ответ, чтобы показать вам, как добавить несколько тестов в один запрос. –

+0

ах ... я вижу, теперь имеет смысл. благодаря! – mike

0

Я думаю, что лучше всего использовать для этого запрос 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 
+0

не должны вступать в 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 

тогда ваш сценарий может проверить все поля, которые вы хотите сравнить и при необходимости распечатать стороны 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

очень подробно ... спасибо!теперь, чтобы выяснить, какой маршрут принять ... – 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 

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

0

Я думаю, что лучший способ i 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

Не используйте 'mysql', вместо этого используйте' mysqli' – Luke

Смежные вопросы