设想情况:
我有一个网站,让用户投票之间的汽车,他们最喜欢。汽车保存在表cars中,选票保存在votes中,列country_id从表cars引用保存到countries (汽车品牌来自那里)。
我想向用户展示哪个国家拥有最多的选票。表的简单版本:
CARS
id
name
country_idCountries
id
nameVotes
id
user_id
car_id理想情况下,我想向用户展示排名前十的国家。他们都有多少选票。
的好处是:是否可以对某个用户使用此查询?所以他们看到了他们所投票的国家的头等大事。
你建议什么索引?选票表可以增长超过1000万张选票,汽车表也可以快速增长。
发布于 2013-06-09 12:45:19
我认为您可以通过LEFT JOIN查询和GROUP BY聚合函数来实现这一点。
SELECT COUNT(a.id) as total_votes, c.name as country_name
FROM Votes a
LEFT JOIN CARS b
ON a.car_id = b.id
LEFT JOIN Countries c
ON b.country_id = c.id
GROUP BY b.name, c.name
ORDER BY total_votes DESC发布于 2013-06-09 12:57:15
关于Cars.CountryID、Votes.UserID和Votes.CarID的索引似乎是合理的。然而,正如mzedler所建议的那样,当你达到数千万时,聚合可能是个坏主意。
解决这个问题的方法有很多,触发器、缓存或将日期添加到选票中,这样就可以在一次投票中分解必须计数的记录数。例如,缓存每天投票,然后查询自午夜以来所做的,然后对它们进行汇总。
https://stackoverflow.com/questions/17009706
复制相似问题