php - 按行和每行列将表与另一个表进行比较

标签 php mysql mysqli

我有两个具有相同结构的表。 (引用下文)

records = id (int, auto increment), name (varchar 250), age (int), address (varchar 250)
backup = id (int), name (varchar 250), age (int), address (varchar 250)

两个表都包含 3 条记录。现在,我想按行的每列比较这两个表,如果有一行与比较表上的相应行不匹配,则会产生错误。

表“记录”内容:

row 1 : column id = 1, column name = name1, column age = 12, column address = USA
row 2 : column id = 2, column name = name2, column age = 17, column address = USA
row 3 : column id = 3, column name = name3, column age = 32, column address = USA

表“备份”内容:

row 1 : column id = 1, column name = name1change, column age = 12, column address = USA
row 2 : column id = 2, column name = name2, column age = 17, column address = USA
row 3 : column id = 3, column name = name3, column age = 32, column address = USA

从上面的表内容可以看到,表“备份行1,列名”发生了变化,name1(记录表)改为name1change(备份表)。因此,当表记录的第 1 行与表备份的第 1 行进行比较并发现差异时,它将获得行号和列名,后跟错误文本(请参阅下文)

echo $errorRow . "with" . $errorColumnOfTheErrorRow . "didn't match, there's is changes";

我想循环直到具有相同进程的记录结束(比较)。怎样制作呢?任何想法、帮助、建议和推荐将不胜感激。谢谢!

到目前为止,我尝试的是(引用下文)

$sql = "SELECT DISTINCT * FROM (SELECT a.* FROM records a UNION SELECT b.* FROM backup b ) c";
$result = mysqli_query($this->db,$sql);
$sql = "SELECT COUNT(*), id FROM (SELECT DISTINCT * FROM (SELECT a.* FROM records a UNION SELECT b.* FROM backup b ) c ) d GROUP BY id;";
$result = mysqli_query($this->db,$sql);

echo $result;

如上面的查询,我试图显示不匹配的行,但遗憾的是,不起作用。

最佳答案

你可以用 SQL 的一种很好的方式来做到这一点: 第一步:将所有数据放在一起并仅保留不同(=不相同)的行:

SELECT DISTINCT *
FROM (
SELECT a.*
FROM records a
UNION
SELECT b.*
FROM backup b ) c

第二步: 统计ID出现超过1次的所有记录:

SELECT COUNT(*), id 
FROM (
SELECT DISTINCT *
FROM (
SELECT a.*
FROM records a
UNION
SELECT b.*
FROM backup b ) c ) d
GROUP BY id
HAVING COUNT(*)>1;

这将为您提供行不相同的确切 ID。

第三步: 获取包含更改数据的行:

SELECT * FROM (
SELECT "current data" AS description,f.* FROM 
records f
INNER JOIN (
SELECT id 
    FROM (
    SELECT DISTINCT *
    FROM (
    SELECT a.*
    FROM records a
    UNION
    SELECT b.*
    FROM backup b ) c ) d
    GROUP BY id
    HAVING COUNT(*)>1 ) e ON f.id=e.id
UNION 
SELECT "backup data" AS description, g.* FROM 
records g
INNER JOIN (
SELECT id 
    FROM (
    SELECT DISTINCT *
    FROM (
    SELECT a.*
    FROM records a
    UNION
    SELECT b.*
    FROM backup b ) c ) d
    GROUP BY id
    HAVING COUNT(*)>1 ) h ON g.id=h.id;
) i ORDER BY id ASC, description ASC;

虽然不漂亮,但很管用:)

关于php - 按行和每行列将表与另一个表进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29292669/

相关文章:

php - 使大型 Mysqli 插入更高效

php - WooCommerce - 将列添加到 Product Cat 管理表

php - 如何找出5天前的日期?

PHP/MySql 集群

php - 301页面能被google抓取吗?

php - 如何将 MySQL 中的 id 添加到 session cookie

mysql - MySQL中如何连接两个结果集?

mysql - 如何在MySQL中使用UNIQUE关键字创建基于2列的索引?

php - 如何使用 php mysqli 更新多于 99 的行

php - Windows Server 上的 PDOException