我有两个具有相同结构的表。 (引用下文)
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/