mysql - 比较两个数据库表的值 -> MySQL

标签 mysql comparison

我在 StackOverflow 上查看了各种主题,但无法找到适合我问题的解决方案。这是我得到的:

我有两个数据库表。一个表应该是某种引用模型,看起来类似于此示例:

+----+----------------+----------------+----------------+-----------------+
| ID |     FIELD1     |     FIELD2     |     FIELD3     |     FIELD 4     |
+----+----------------+----------------+----------------+-----------------+
|  1 | Value1_Field_1 | Value1_Field_2 | Value1_Field_3 | Value1_Field_4  |
|  2 | Value2_Field_1 | Value2_Field_2 | Value2_Field_3 | Value2_Field_4  |
|  3 | Value3_Field_1 | Value3_Field_2 | Value3_Field_3 | Value3_Field_4  |
|  4 | Value4_Field_1 | Value4_Field_2 | Value4_Field_3 | Value4_Field_4  |
|  5 | Value5_Field_1 | Value5_Field_2 | Value5_Field_3 | Value5_Field_4  |
+----+----------------+----------------+----------------+-----------------+

现在我将新数据输入到第二个表中。这些数据可以具有相同的值以及相同的行数。但也可能发生某些数据具有更多行或行内的值不同的情况。这是另一个表格示例,其中我有多一行并且两个值不同:

+----+----------------+-----------------+-----------------+----------------+
| ID |     FIELD1     |     FIELD2      |     FIELD3      |    FIELD 4     |
+----+----------------+-----------------+-----------------+----------------+
|  1 | Value1_Field_1 | Value1_Field_2  | Value1_Field_3  | Value1_Field_4 |
|  2 | Value2_Field_1 | Value2_Field_2  | Value2_Field_3  | Value2_Field_4 |
|  3 | Value3_Field_1 | Value3_Field_2  | Value3_NEWVALUE | Value3_Field_4 |
|  4 | Value4_Field_1 | Value4_Field_2  | Value4_Field_3  | Value4_Field_4 |
|  5 | Value5_Field_1 | Value5_NEWVALUE | Value5_Field_3  | Value5_Field_4 |
|  6 | Value6_Field_1 | Value6_Field_2  | Value6_Field_3  | Value6_Field_4 |
+----+----------------+-----------------+-----------------+----------------+

我正在寻找一个 SQL 语句来比较这两个表并列出所有不同的记录。在我上面的示例中,SQL 语句应该返回这些信息:

+----+----------------+-----------------+-----------------+----------------+
| ID |     FIELD1     |     FIELD2      |     FIELD3      |    FIELD 4     |
+----+----------------+-----------------+-----------------+----------------+
|  3 |                |                 | Value3_NEWVALUE |                |
|  5 |                | Value5_NEWVALUE |                 |                |
|  6 | Value6_Field_1 | Value6_Field_2  | Value6_Field_3  | Value6_Field_4 |
+----+----------------+-----------------+-----------------+----------------+

这是我迄今为止尝试过的:

SELECT distinct FIELD1, FIELD2, FIELD3, FIELD4 from table_references
union
SELECT distinct FIELD1, FIELD2, FIELD3, FIELD4  from table_new_data

该语句返回所有行,但仅返回一次。这不是我要找的。我也用这段代码尝试过:

SELECT FIELD1, FIELD2, FIELD3, FIELD4
FROM (
SELECT FIELD1, FIELD2, FIELD3, FIELD4 FROM table_references
UNION ALL
SELECT FIELD1, FIELD2, FIELD3, FIELD4 FROM table_new_data
) tbl
GROUP BY FIELD1
HAVING count(*) = 1
ORDER BY FIELD1

该代码仅返回第 6 行,但不显示 ID 3 和 5 内的新值。

任何帮助将不胜感激。提前致谢!

编辑: 根据@Madhur Bhaiya 解决方案,我犯了一个错误。输出应如下所示:

+----+----------------+-----------------+-----------------+----------------+
| ID |     FIELD1     |     FIELD2      |     FIELD3      |    FIELD 4     |
+----+----------------+-----------------+-----------------+----------------+
|  3 | Value3_Field1  | Value3_Field2   | Value3_NEWVALUE | Value3_Field4  |
|  5 | Value5_Field1  | Value5_NEWVALUE | Value5_Field3   | Value5_Field4  |
|  6 | Value6_Field_1 | Value6_Field_2  | Value6_Field_3  | Value6_Field_4 |
+----+----------------+-----------------+-----------------+----------------+

因此,我还需要受影响行中值不同的所有值。

最佳答案

我们可以使用LEFT JOIN来比较两个表,然后使用If()等条件函数来获取相应的值:

查询

SELECT tnew.*
FROM table_new_data AS tnew
LEFT JOIN table_references AS told
  ON told.ID = tnew.ID
WHERE (told.ID IS NOT NULL AND 
       (tnew.FIELD1 <> told.FIELD1 OR 
        tnew.FIELD2 <> told.FIELD2 OR 
        tnew.FIELD3 <> told.FIELD3 OR 
        tnew.FIELD4 <> told.FIELD4)
      ) OR 
      told.ID IS NULL;

结果

| ID  | FIELD1         | FIELD2          | FIELD3          | FIELD4         |
| --- | -------------- | --------------- | --------------- | -------------- |
| 3   | Value3_Field_1 | Value3_Field_2  | Value3_NEWVALUE | Value3_Field_4 |
| 5   | Value5_Field_1 | Value5_NEWVALUE | Value5_Field_3  | Value5_Field_4 |
| 6   | Value6_Field_1 | Value6_Field_2  | Value6_Field_3  | Value6_Field_4 |

View on DB Fiddle

关于mysql - 比较两个数据库表的值 -> MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53852022/

相关文章:

php - 删除php表中每一行的按钮

javascript - 根据选择框中选择的item_ID从MySQL检索数据

java - 在java中将double与int进行比较是否有效?

python从多个列表中选择具有引用的最低字母数字值

data-structures - 后缀数组在哪里比后缀树更好?

php - 管理 CodeIgniter 中的 "A Database Error Occurred"1062 错误

c# - 如何将字符串数组插入mysql json列

php - 从mysql获取随机好友

c# - 比较网站的文本内容

php - PHP 中的 !== 和 != 有区别吗?