情景:
我有一个网站,让用户在他们最喜欢的汽车之间投票。汽车保存在表格cars
中,投票保存在votes
中,而列表country_id则从表格cars
引用countries
(carbrand来自的地方)。
我想向用户显示哪个国家/地区的投票率最高。简单版本的表格:
CARS
id
name
country_id
国家
id
name
投票
id
user_id
car_id
理想情况下,我想向用户展示前x个国家/地区。他们都有多少票。
加分:是否可以将此查询用于特定用户?所以他们看到他们的最高x与他们投票的国家。
你建议使用哪些索引?投票表可以超过1000万票,汽车表也可以快速增长。
答案 0 :(得分:1)
我认为您可以使用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
答案 1 :(得分:1)
Cars.CountryID,Votes.UserID和Votes.CarID上的索引似乎是合理的。正如mzedler建议的那样,当你达到数千万时,聚合可能是一个坏主意。
有多种方法可以解决这些问题,触发器,缓存或添加投票选票的日期,因此您可以分解您必须一次性计算的记录数。例如,每天缓存投票,然后只查询自午夜以来的投票,然后对它们求和。