首页 > 解决方案 > 比较MySQL中表中同一列的属性

问题描述

我有一个包含以下列的表格:TitleID (VARCHAR),Version (BIGINT), CreatedAt (DATETIME) 通常不同版本的标题是按顺序排列的,但是最近我开始获得它们不按顺序排列的条目,即

TitleID     Version      CreatedAt
ABCDE         2           2018-06-10 20:28:37
ABCDE         1           2018-06-13 10:00:12
ABCDE         3           2018-06-13 20:00:00
XYZ           2           2018-06-13 20:00:00
XYZ           1           2018-06-13 20:00:01

正如您在 Title ABCDE 中看到的那样,版本 2 出现在版本 1 之前,版本 3 出现在预期的版本 2 之后。对于 Title XYZ,版本 2 也位于版本 1 之前。我正在尝试编写一个查询,让我知道哪些标题及其版本在过去 2 周内出现故障。为此,我尝试以这种方式编写查询:

SELECT * FROM REVIEWS T1 WHERE T1.TitleID IN
    (SELECT TitleID FROM REVIEWS T2 WHERE CreatedAt > '2018-05-30'
        AND T1.CreatedAt < T2.CreatedAt AND T1.Version > T2.Version)
AND CreatedAt > '2018-05-30';

标签: mysqlsql

解决方案


将表连接到自身,省略版本相等的行,然后过滤 Version/CreatedAt 不一致。

select 
  t1.TitleID, 
  t1.Version, 
  t1.CreatedAt, 
  t2.Version, 
  t2.CreatedAt 
from reviews t1
join reviews t2 
  on t1.TitleID = t2.TitleID and t1.Version != t2.Version
where 
  (t1.Version > t2.Version and t1.CreatedAt < t2.CreatedAt)

这是小提琴


推荐阅读