MySql 从 2 个不同的列中获取具有最大修订版的行
MySql get row with max revision from 2 different column
这是我的 Table:
id dl_id rev1 rev2
1 48 1 0
2 48 1 1
3 50 0 2
4 50 1 2
5 50 2 1
这是通缉结果:
id dl_id
2 48
4 50
rev2 比 rev1 具有更高的优先级,所以我想要 dl_id 的 id 和 max revison。
这是我的查询:
select distinct dl_id,
(select id from myTable
where dl_id=m.dl_id
order by rev2 desc,rev1 desc limit 0,1) as id
from myTable m
我的查询太慢了,运行 花了 4 秒。
我需要更好的查询
例如(并注意索引):
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,dl_id INT NOT NULL
,rev1 INT NOT NULL
,rev2 INT NOT NULL
,UNIQUE(dl_id,rev1,rev2)
);
INSERT INTO my_table VALUES
(1 ,48 ,1 ,0),
(2 ,48 ,1 ,1),
(3 ,50 ,0 ,2),
(4 ,50 ,1 ,2),
(5 ,50 ,2 ,1);
SELECT x.*
FROM my_table x
JOIN
( SELECT a.dl_id
, a.rev2
, MAX(a.rev1) rev1
FROM my_table a
JOIN
( SELECT dl_id
, MAX(rev2) rev2
FROM my_table
GROUP
BY dl_id
) b
ON b.dl_id = a.dl_id
AND b.rev2 = a.rev2
GROUP
BY a.dl_id
, a.rev2
) y
ON y.dl_id = x.dl_id
AND y.rev2 = x.rev2
AND y.rev1 = x.rev1;
+----+-------+------+------+
| id | dl_id | rev1 | rev2 |
+----+-------+------+------+
| 2 | 48 | 1 | 1 |
| 4 | 50 | 1 | 2 |
+----+-------+------+------+
这是我的 Table:
id dl_id rev1 rev2
1 48 1 0
2 48 1 1
3 50 0 2
4 50 1 2
5 50 2 1
这是通缉结果:
id dl_id
2 48
4 50
rev2 比 rev1 具有更高的优先级,所以我想要 dl_id 的 id 和 max revison。
这是我的查询:
select distinct dl_id,
(select id from myTable
where dl_id=m.dl_id
order by rev2 desc,rev1 desc limit 0,1) as id
from myTable m
我的查询太慢了,运行 花了 4 秒。 我需要更好的查询
例如(并注意索引):
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,dl_id INT NOT NULL
,rev1 INT NOT NULL
,rev2 INT NOT NULL
,UNIQUE(dl_id,rev1,rev2)
);
INSERT INTO my_table VALUES
(1 ,48 ,1 ,0),
(2 ,48 ,1 ,1),
(3 ,50 ,0 ,2),
(4 ,50 ,1 ,2),
(5 ,50 ,2 ,1);
SELECT x.*
FROM my_table x
JOIN
( SELECT a.dl_id
, a.rev2
, MAX(a.rev1) rev1
FROM my_table a
JOIN
( SELECT dl_id
, MAX(rev2) rev2
FROM my_table
GROUP
BY dl_id
) b
ON b.dl_id = a.dl_id
AND b.rev2 = a.rev2
GROUP
BY a.dl_id
, a.rev2
) y
ON y.dl_id = x.dl_id
AND y.rev2 = x.rev2
AND y.rev1 = x.rev1;
+----+-------+------+------+
| id | dl_id | rev1 | rev2 |
+----+-------+------+------+
| 2 | 48 | 1 | 1 |
| 4 | 50 | 1 | 2 |
+----+-------+------+------+