我正在使用一个数据库来存储选举结果,其中列为id、candidate、post_time和result。在"计票"过程中,结果会被放入数据库。当有新的更新可用时,将插入一个新条目。
从这个数据库中,我想创建一个表,其中包含每个候选项(GROUP BY
候选项)的最新结果(MAX post_time
),按结果排序(ORDER BY
结果)。
如何将其转换为有效的SQL语句?
(我尝试过mysql订单和groupby,但没有成功)
我试过:
SELECT *, MAX(time_post)
FROM [database]
GROUP BY candidate
HAVING MAX(time_post) = time_post
ORDER BY result
假设每个候选人不同时有多个结果,下一个应该有效:
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
请注意,MAX
不会选择具有最大时间的记录,而是会从任何记录中选择最大值。所以
SELECT MAX(a), MAX(b) FROM example
其中exmple包含两个记录a=1, b=2
和a=4, b=0
,将导致数据中没有的a=4, b=2
。您可能应该创建一个视图,其中只包含每个候选人的最新投票,然后查询。为了提高性能,使用物化视图可能是明智的。
所有最新结果的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
根据我从你的尝试中看到的情况,我认为你应该使用这个
SELECT MAX(post_time) FROM `table` GROUP BY candidate ORDER BY result
但MAX语句只返回一个值,因此我不明白为什么需要ORDER BY。
如果您想要多个结果,请尝试查找TOP统计
单向(显示并列结果):
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