2010-02-12 94 views
3

我正在嘗試爲在線編碼事件網站編寫查詢,但我發現處理起來特別困難。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; 

做到這一點,但我真的不希望這樣做。我想知道一個查詢是否可以完成我想要的。如果是,我想知道如何。

+0

注意:「對於給定的問題」是指「你有一個特定的問題」,例如, 「問題#1234」; 「對於每一個問題」意味着「你有一系列問題」,即「針對數據庫中的每個問題」。正如你所看到的,這些不是等同的,解決方案是非常不同的。 – Piskvor 2010-02-12 10:56:04

回答

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語句完成。

+0

我可以確認它在一組等效數據上工作。 +1 – Piskvor 2010-02-12 11:02:07

+0

好吧,這是我的第二選擇。謝謝! – jrharshath 2010-02-12 11:08:54

1

對於PID = 1234:

SELECT pid, uid, subts FROM submissions WHERE pid = 1234 ORDER BY subts DESC LIMIT 1; 

換句話說,發現所有的行與此pid,並獲得最大的subts從那些行(你可以有不同的pid s的不同「爲最大subtspid「)


原始查詢說: 的每一行,給我piduid,{整個表中最大的subts};只返回給定的第一行pid

所以你select採取第一行,得到PID和UID從它,然後查找最大subts在所有行。

+0

這會給我提交pid 1234的最新提交的人。我想知道是誰爲每個pid提交了最後一個答案:所有這些都在單個查詢中提交。它甚至有可能嗎? – jrharshath 2010-02-12 10:37:52

+0

@jrharshath:從修訂版1開始,你的問題就是:「我想知道:誰是提交他的解決方案的最新用戶?這就是你要求的,這就是這個答案給你的。你似乎在評論中要求不同的東西。發現你實際上想要的東西比你原先想象的還要好;請更新問題以反映這一點。 – Piskvor 2010-02-12 10:44:57