PHP ile MySQL iki tablo arasındaki verileri karşılaştırarak

3 Cevap php

İki tablo table1 = kayıtları, table2 = çoğaltmaları var. Her iki tablo herhangi bir zamanda sütun değişken bir dizi içerir ve her ikisi de table2 ilave bir ID sütunu olan hariç olmak üzere, aynı sütunlar içerir ... Her iki tablo bir sütun , user_id. Veri CSV ithalat geliyor. user_id zaten mevcutsa table1 o table2 sokulur.

table2 Tüm satırları kapmak ve bir tabloda hiçbir sorun onları yazdırmak gerekiyor ile. Bölüm I table2 her bir sütun için ... bulmaktan zor bir zaman yaşıyorum basılı alır ben kontrol etmek gerekirse verilerin (user_id dayalı) veri maçlar table1 ve bir şekilde onu bayrak ... (belki tablo hücresi üzerinde farklı bir renk arka plan)

Örnek:

table1 satır içerir:

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

ve table2:

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

sonra çıkış olacaktır:

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

Ben bu işi yapmak nasıl olarak herhangi bir fikir? Herhangi bir yardımcı olursa, ben Codeigniter ile bu app inşa ediyorum.

3 Cevap

Bu sorgu, aksi durum 0, tablo2 tüm girdileri seçecektir ve isim tablo1 de adından farklı ise, is_different 1 olacak:

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

Birden fazla sütunu karşılaştırmak gerekirse, tek bir sorguda bu testler birkaç yapabilirsiniz:

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

sonra komut karşılaştırmak ve isteğe bağlı yan 2 değerleri yana yazdırmak istediğiniz tüm alanları kontrol edebilirsiniz.

Her kayıt döndü yazdırmak ve uyumsuzlukları altında, kolay karşılaştırma için orijinal değerlerini içeren ikinci bir satır yazdırabilirsiniz:

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

Bu basit katılmak kullanın. PHP RDBMS iş yapmak, veri seçme ve sipariş ile rahatsız olmamalıdır.