SQL упорядочить, группировать, имея - PullRequest
2 голосов
/ 06 марта 2012

Я использую базу данных для хранения результатов выборов с идентификаторами столбцов, кандидат, post_time и результат.Результаты заносятся в базу данных во время «подсчета голосов».Когда доступно новое обновление, будет добавлена ​​новая запись.

Из этой базы данных я хотел бы создать таблицу с самыми последними результатами (MAX post_time) для каждого кандидата (GROUP BY кандидат),упорядочено по результату (ORDER BY результат).

Как я могу перевести это в рабочий SQL-оператор?

(я пробовал mysql order и groupby без успеха)

Я пробовал:

SELECT *, MAX(time_post) 
FROM [database] 
GROUP BY candidate 
HAVING MAX(time_post) = time_post 
ORDER BY result

Ответы [ 5 ]

2 голосов
/ 06 марта 2012

Предполагая, что у вас нет нескольких результатов на кандидата одновременно, должно сработать следующее:

select r.candiate, r.result
from results r
inner join (
    select candidate, max(post_time) as ptime
    from results
    group by candidate 
) r2 on r2.candiate=r.candidate and r2.ptime=r.post_time
order by r.result
0 голосов
/ 06 марта 2012

В одну сторону (показаны связанные результаты):

SELECT t.*
FROM tableX AS t
  JOIN
    ( SELECT candidate 
           , MAX(time_post) AS time_post
      FROM tableX
      GROUP BY candidate 
    ) AS m
    ON (m.candidate, m.time_post) = (t.candidate, t.time_post)
ORDER BY t.result

и еще один (без связей, показан только один ряд на кандидата):

SELECT t.*
FROM
      ( SELECT DICTINCT candidate
        FROM tableX
      ) AS d
  JOIN 
      tableX AS t
    ON t.PK =                  --- the Primary Key of the table, here
       ( SELECT ti.PK          --- and here
         FROM tableX AS ti
         WHERE ti.candidate = d.candidate
         ORDER ti.time_post DESC
         LIMIT 1
       ) 
ORDER BY t.result
0 голосов
/ 06 марта 2012

Судя по вашим попыткам, я бы подумал, что вы должны использовать это

SELECT MAX(post_time) FROM `table` GROUP BY candidate ORDER BY result

, но МАКСИМАЛЬНОЕ состояние возвращает только одно значение, поэтому я не понимаю, зачем нужен ORDER BY.

если вы хотите получить несколько результатов, попробуйте поискать рейтинг TOP

0 голосов
/ 06 марта 2012

Вероятно ли, что post_time будет одинаковым для всех самых последних результатов? Также каждый кандидат появляется только один раз за post_time?

Этого можно достичь, просто используя оператор SELECT. Есть ли причина, по которой вам нужны результаты в новой таблице?

Если каждый кандидат появляется только один раз за post_time:

SELECT candidate, result
FROM table
WHERE post_time = (SELECT MAX(post_time) FROM table)

Если вы хотите посчитать, сколько раз кандидат появляется в таблице за последний post_time:

SELECT candidate, count(result) as ResultCount
FROM table
WHERE post_time = (SELECT MAX(post_time) FROM table)
GROUP BY candidate
0 голосов
/ 06 марта 2012

Обратите внимание, что MAX не выберет запись с максимальным временем, но выберет максимальное значение из любой записи. Так

SELECT MAX(a), MAX(b) FROM example

, где exmple содержит две записи a=1, b=2 и a=4, b=0, приведет к a=4, b=2, которого не было в данных. Вам, вероятно, следует создать представление с последними голосами только от каждого кандидата, а затем запросить его. Для производительности может быть целесообразно использовать материализованное представление.

...