Сложность с запросом SQL - PullRequest
       10

Сложность с запросом SQL

3 голосов
/ 12 февраля 2010

Я пытаюсь написать запрос для веб-сайта, посвященного событиям кодирования, но мне особенно трудно с этим справиться.

У меня есть таблица представлений:

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.

Редактировать: я мог бы сделать это, перебирая все pids и писать

select pid, uid, max(subts) from submissions where pid=$pid order by subts desc limit 1;

Но я действительно не хочу этого делать. Я хочу знать, может ли один запрос выполнить то, что я хочу. Если да, я хочу знать, как.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010

Это немного сложнее, чем вы думаете, но следующий запрос должен работать:

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 голос
/ 12 февраля 2010

Для pid = 1234:

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

Другими словами, найдите все строки с этим pid и получите самые большие слагаемые из этих строк (для этого * 1009 вы можете иметь разные pid s с разными "самыми большими" subts * ")


Ваш оригинальный запрос говорит: для каждой строки дайте мне pid, uid и {самое большое subts во всей таблице}; вернуть только первый ряд с указанным pid.

Таким образом, ваш select берет первую строку, получает pid и uid из нее, затем ищет самые большие значения в всех строках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...