我正在用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上的经验是,人们似乎出于某种原因比子查询更喜欢连接。如果您想要子查询答案,请告诉我。)