我正在用PHP编写一个web应用程序,使用mySQL对选举进行建模。
我有三张桌子:候选人、选举和选票。选票包含CandidateID、ElectionID和Count,这是给定候选人在给定选举中被投票的次数。投票还包含时间戳,这是最后一次修改行,用于打破联系(较早的投票获胜)。候选人可能参加过多次选举。我怎样才能找到一个候选人曾经赢得过多少次选举?
非常感谢大家的帮助,谢谢。
一些示例数据:

CREATE TABLE IF NOT EXISTS `Votes` (
`ElectionID` int(11) unsigned NOT NULL,
`CandidateID` int(11) unsigned NOT NULL,
`Count` smallint(5) unsigned NOT NULL DEFAULT '0',
`stamp` int(11) unsigned NOT NULL,
PRIMARY KEY (`ElectionID`,`CandidateID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `Votes` (`ElectionID`, `CandidateID`, `Count`, `stamp`)
VALUES
(1, 1, 3, 1332897534),
(4, 1, 3, 1333149930),
(4, 4, 2, 1333149947),
(4, 5, 3, 1333149947),
(1, 4, 4, 1333153373);

期望输出:一行一列,是某个候选人的获胜数

最佳答案

你可以写:

SELECT COUNT(1)
  FROM Elections AS e
 INNER
  JOIN Votes AS v1 -- representing the candidate of interest
    ON v1.ElectionID = e.ID
   AND v1.CandidateID = ...
  LEFT
 OUTER
  JOIN Votes AS v2 -- representing a candidate who beat the candidate of interest
    ON v2.ElectionID = e.ID
   AND (    v2.Count > v1.Count
         OR (     v2.Count = v1.Count
              AND v2.stamp < v1.stamp
            )
       )
 WHERE v2.ElectionID IS NULL -- meaning that no candidate beat the candidate of interest
;

(也可以用EXISTS和相关子查询表示其中的一个或两个连接;或者第一个连接可以用不相关子查询更改为IN;但是上面最有可能执行得最好,IMHO,我在StackOverflow上的经验是,人们似乎出于某种原因比子查询更喜欢连接。如果您想要子查询答案,请告诉我。)

10-08 03:44