SQL排序依据、分组依据、拥有


SQL order by, group by, having

我正在使用一个数据库来存储选举结果,其中列为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=2a=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