MySQL |从一个表中选择两个最大值
我有ID(电视剧ID)、T(翻译ID)、S(季节)、E(插曲) 我需要将其转换为:MySQL |从一个表中选择两个最大值,mysql,sql,Mysql,Sql,我有ID(电视剧ID)、T(翻译ID)、S(季节)、E(插曲) 我需要将其转换为: | ID | T | S | E | | 1 | 1 | 1 | 2 | | 1 | 1 | 1 | 3 | | 1 | 2 | 1 | 3 | | 2 | 3 | 2 | 1 | | 2 | 3 | 3 | 1 | 为此: | ID | T | S | E | | 1 | 1 | 1 | 3 | | 1 | 2 | 1 | 3 | | 2 | 3 | 3 |
| ID | T | S | E |
| 1 | 1 | 1 | 2 |
| 1 | 1 | 1 | 3 |
| 1 | 2 | 1 | 3 |
| 2 | 3 | 2 | 1 |
| 2 | 3 | 3 | 1 |
为此:
| ID | T | S | E |
| 1 | 1 | 1 | 3 |
| 1 | 2 | 1 | 3 |
| 2 | 3 | 3 | 1 |
我的想法是:
SELECT `ID, `T`, `S`, `E`
FROM `UPDATE`
WHERE
`S` = (SELECT MAX(`S`) FROM `UPDATE` WHERE `ID` = `ID`)
AND `E` = (SELECT MAX(`E`) FROM `UPDATE` WHERE `ID` = `ID` AND `S` = (SELECT MAX(`S`) FROM `UPDATE` WHERE `ID` = `ID`))
GROUP BY `ID`, `T`
ORDER BY `TIMESTAMP` DESC
我想这会管用的。您需要首先确定每个ID和T的最大值S。一旦确定了这些值,就可以在所有三个字段上连接回原始表以获得最大值E
SELECT A.ID, A.T, A.S, MAX(B.E) as E
FROM (
SELECT ID, T, MAX(S) AS S
FROM `UPDATE` U
GROUP BY ID, T) A
INNER JOIN `UPDATE` B
ON A.ID = B.ID AND A.T = B.T AND A.S = B.S
GROUP BY A.ID, A.T, A.S
使用notexists()
获取每对id、t
和max()的最新一季,获取最新一集
select id, t, s, max(e) as e
from tbl
where not exists (
select 1
from tbl as i
where i.id = tbl.id
and i.t = tbl.t
and i.s > tbl.s
)
group by id, t, s
或者使用左连接作为:
select tbl.id, tbl.t, tbl.s, max(tbl.e) as e
from tbl
left join tbl i
on i.id = tbl.id
and i.t = tbl.t
and i.s > tbl.s
where i.id is null
group by tbl.id, tbl.t, tbl.s;
rextester演示:
返回
+----+---+---+---+
| id | t | s | e |
+----+---+---+---+
| 1 | 1 | 1 | 3 |
| 1 | 2 | 1 | 3 |
| 2 | 3 | 3 | 1 |
+----+---+---+---+
请解释你的逻辑。你的结果的标准是什么?也就是说,您希望在结果集中得到什么值?另外,您的查询生成了什么?是否有效?您的问题是什么?我需要同时具有最大s和E的记录。我的查询不起作用,因为我不知道如何在子查询中使用相同的ID。我不能在查询中使用max(),因为它将只返回一个结果,但是我需要每个T的最大S和E。@diecode添加了一个rextester演示,这样您就可以看到结果返回每个ID的最大S和E,TMySQL执行这个太长时间了,我无法得到响应。我尝试使用withTIMESTAMP>=NOW()-INTERVAL 1 DAY
为什么MySQL会在这个查询上阻塞?@diecode在更新前后添加了反勾号,它被解释为一个命令而不是一个表名。现在试试。@diecode实际上使用了单引号。更正为反勾号。但不确定这是否是mysql的正确语法。我尝试了这个。MySQL错误“未知列”。还试了“A”。“ID”太棒了!非常感谢。