0

场景:

我有一个网站,可以让用户在他们最喜欢的汽车之间进行投票。汽车保存在表中cars,投票保存在表中votes的 country_id 列carscountries(carbrand 来自哪里)。

我想向用户展示哪个国家的选票最多。表格的简单版本:

汽车

id
name
country_id

国家

id
name

投票

id
user_id
car_id

理想情况下,我想向用户展示前 x 个国家/地区。以及他们都有多少票。

奖金:是否可以将此查询用于某个用户?因此,他们会看到他们投票选择的国家/地区的前 x。

您建议使用哪些索引?投票表可以增长到超过 1000 万票,汽车表也可以快速增长。

4

2 回答 2

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
于 2013-06-09T12:45:19.660 回答
1

Cars.CountryID、Votes.UserID 和 Votes.CarID 上的索引似乎是合理的。正如 mzedler 建议的那样,当您达到数千万时,聚合可能不是一个好主意。

有很多方法可以解决这个问题,触发器、缓存或将投票日期添加到投票中,因此您可以一次性分解必须计算的记录数量。例如,每天缓存投票,然后只查询自午夜以来所做的投票,然后将它们相加。

于 2013-06-09T12:57:15.963 回答