我正在尝试为在线编码事件网站编写查询,但我发现它特别难以处理。
我提交了一份表格:
submissions => subid | uid | pid | subts | status
uid = userid
pid = problem id
subts = timestamp when the submission was submitted
status = whether the answer is right or not
用户可能已为给定的pid进行了多次提交。
我想知道:谁是最新的用户,为每个问题提交解决方案?
目前,我不在乎解决方案是对还是错。
我可以使用的查询是
select pid, uid, max(subts) from submissions group by pid;
但它不按照我想要的方式工作。此查询找到最大值ts,但与之关联的uid不正确。
任何人都可以教我查询错误吗?为我的目的编写查询的正确方法是什么?
由于
注意:我正在使用mysql。
编辑:我可以通过遍历所有pid并编写
来完成此操作select pid, uid, max(subts) from submissions where pid=$pid order by subts desc limit 1;
但我真的不想这样做。我想知道单个查询是否可以实现我想要的。如果是,我想知道如何。
答案 0 :(得分:3)
这比你想象的要复杂一些,但下面的查询应该有效:
SELECT s.uid, s.pid, s.subts
FROM submissions s,
(SELECT max(subts) as maxdate, pid
FROM submissions
GROUP BY pid) maxresults
WHERE s.pid = maxresults.pid
AND s.subts = maxresults.maxdate;
您是否将此计为单个查询取决于您,但我相信单个SELECT语句无法完成。
答案 1 :(得分:1)
对于pid = 1234:
SELECT pid, uid, subts FROM submissions WHERE pid = 1234 ORDER BY subts DESC LIMIT 1;
换句话说,找到包含此pid
的所有行,并从这些行中获取最大的子 (您可以使用不同的“pid
来设置不同的”subts
1}}对于此pid
“)
您的原始查询说:
对于每一行,请给我pid
,uid
和{整个表中最大的subts
};只返回给定pid
的第一行。
因此,您的select
获取第一个行,从中获取pid和uid,然后在所有行中查找最大的子域。