SQL查询的难度

时间:2010-02-12 10:31:33

标签: mysql sql

我正在尝试为在线编码事件网站编写查询,但我发现它特别难以处理。

我提交了一份表格:

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;

但我真的不想这样做。我想知道单个查询是否可以实现我想要的。如果是,我想知道如何。

2 个答案:

答案 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“)


您的原始查询说: 对于每一行,请给我piduid和{整个表中最大的subts};只返回给定pid的第一行。

因此,您的select获取第一个行,从中获取pid和uid,然后在所有行中查找最大的子域。