MySQL加入问题

时间:2011-08-12 14:37:26

标签: mysql cakephp

我正在为客户端制作一个政治应用程序,我有两个数据库表。一个拥有某个城市的所有登记选民,另一个拥有每个登记选民的所有选票。结合起来,这两个表的数量超过700万条记录。该网站在CakePHP上编码。

我已经按照一些标准缩小了结果范围,但我还需要根据特定选民自登记以来投票的百分比来过滤它。我有所有的选票,他们登记的那一年,每4年有3次选举。我已经尝试过子查询来过滤结果,但是花了太长时间。返回10条记录需要10分钟。我必须以某种方式加入,但我并不熟悉连接。

这基本上就是我需要做的事情:

  SELECT * FROM voters 
     WHERE (number of votes voter has) >= (((year(now())-(registration_year) ) * 3/4)
     * (percentage needed))

所有这一切都非常简单。诀窍在于计算选民从投票数据库中获得的选票。有什么想法吗?

5 个答案:

答案 0 :(得分:0)

创建另一个表,或扩展您的第一个表(包含选民信息,但不是他们的投票的表)有两列 - #votes和registrationAge。然后你可以通过扫描'投票'表一次更新这个表 - 每次你遇到投票时,只需增加点数。

答案 1 :(得分:0)

我不会尝试将此作为查询的一部分进行计算

如果此信息在四年内仅更改3次,我会将投票的%字段添加到选民表中,并在每次选举后计算一次。然后你可以简单地按字段过滤。

答案 2 :(得分:0)

您可以向投票人表添加一个vote_count字段,并对其进行更新计数。您可能希望在直接sql查询中执行此操作:Aggregate function in an SQL update query?

另外,我不确定mysql是否足够智能来优化它,但不要使用year(now()):你可以在PHP中获取该值,或者只是在每次运行时硬编码(你可能不需要经常运行它。)

答案 3 :(得分:0)

这个怎么样:

SELECT voters.* FROM voters
     LEFT JOIN (SELECT COUNT(voterid) AS votes,voterid AS id FROM votes) AS a
         ON voters.id = a.id
     WHERE a.votes >= (((year(now())-(voters.registration_year) ) * 3/4) * percentage

答案 4 :(得分:0)

我建议创建一个视图,然后对视图进行建模以获取数据