【问题标题】:SQL compare rows with displaying differences in columns in the same tableSQL 比较行与显示同一表中列的差异
【发布时间】:2017-08-07 11:26:05
【问题描述】:

您好,我正在寻找 SQL 或 MySQl 中关于比较同一表中的行的查询

该查询应显示具有相同 id 但列中的记录不同的最后 2 行

我的桌子

ID|is_superuser|username|first_name|last_name|email          |is_staff|is_active|
 1|           1|admin   |FC        |         |admin@admin.com|       1|        1|
 1|           1|admin   |          |         |admin@admin.com|       1|        1|
 1|           1|admin   |adminname |         |admin@admin.eu |       1|        1|

结果:

ID|username|first_name|email|
 1|admin   |adminname |admin@admin.eu|
 1|admin   |          |admin@admin.com|

求帮助

【问题讨论】:

  • 可以在post中添加表的create和insert语句吗?
  • 我不明白你最终得到三分之二的特定记录的逻辑。所有三个记录都有相同的时间戳。
  • 结果应该显示 ID|USERNAME + 列与最后两行之间的差异
  • 我想创建一个包含所有日志更改的历史模块。此查询可以轻松比较具有相同 ID 的两行
  • 您能否在您的示例数据集中再添加几条记录,这将有助于清楚地了解逻辑?是不是要比较所有记录中具有相同上次登录的 ID 记录和所有记录的加入日期?

标签: mysql sql compare rows


【解决方案1】:

您可以使用exists 子句来要求另一行具有相同的id 但不同的email

select  *
from    MyTable t1
where   exists
        (
        select  *
        from    MyTable t2
        where   t1.id = t2.id
                and coalesce(t1.email, '') <> coalesce(t2.email, '')
        )

根据您的评论,如果您有很多列,您可以使用如下查询生成 where 子句:

select  concat('and coalesce(t1.', column_name, ', '''') <> coalesce(t2.', 
               column_name, ', '''')')
from    information_schema.columns
where   table_name = 'MyTable'

【讨论】:

  • 是的,但我有 200 列,我需要显示两个日志之间的差异,所以我不知道哪些列被更改了
  • 您可以生成where 子句,添加示例
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2015-04-06
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多