我有一个网站,人们可以在上面对汽车进行投票。向用户展示了 4 辆汽车,他/她可以对他们最喜欢的汽车进行投票。
该表cars
具有重要的列:
car_id int(10) (not auto_increment, so has gaps)
views int(7)
points int(7)
car_type int(1) (value = 1, 2 or 3)
目前我为所有 car_types 使用一个映射表,它有一个没有间隙的 PK。我选择映射表的最大 ID 并创建 4 个随机数 (PHP),从映射中选择这些行并获取相应的 car_id。cars
我用这些数字从表中选择汽车。
问题是后来添加到数据库中的汽车获得与之前添加的汽车相同的分数的机会更少。
我的问题是如何显示 4 辆具有相同数量的点(随机)的汽车,按最少的视图(视图 asc)排序。还有重要的注意事项:
- 选择应该只查询至少有1 分的汽车。
- 该数据库将包含超过 3000 万辆汽车,这不是关于汽车的,而是关于我认为更容易的问题 :)。
- 当 70% 的汽车得 1 分、20% 的汽车得 2 分、10% 的汽车得 3 分时,随机点应该选择汽车 70% 得 1 分、20% 得 2 分、10% 得 3 分。
- 查询将用于向访问者显示 4 辆车,我们都知道用户不耐烦所以查询越快越好:)
- 我可以(如果需要)使用一个映射表,它在 PK 中没有间隙(就像我现在一样)。
- 只会显示特定 car_type 内的汽车。例如,4 辆随机的 2 型车(即家用车),因为我不想同时显示跑车和家用车。
如果您知道解决上述问题的另一种解决方案,我愿意接受所有类型的解决方案(PHP/SQL)。
赏金,因为它是一个比一般的 Stackoverflow 问题更大的问题(/答案)。赏金将奖励给描述解决方案或(首选)解决方案代码的人。无论如何,这是我感谢帮助我的人并确保我非常感谢您的帮助的方式。
更新:
感谢您到目前为止的所有答案!你的答案是对的。过去几个小时我确实想了很多,我开始意识到数据库实际上从来没有为这样的事情而构建(显示随机数据),它的创建是为了显示快速访问的精确和准确的数据。这就是为什么在 PK 上选择 30M 或更多行仍然非常快的原因。这就是为什么我正在考虑在 PHP 中做所有随机的事情。所以我在 PHP 中生成 40 个随机数,然后从正确车型的映射表中选择这 40 行。这个选择IN
非常快(比如 0.0006 秒)。在这个选择之后,我得到了 40 个 car_id,我也选择了IN
从汽车表。我循环汽车并将它们放在一个数组中并进行一些自定义排序(基于点和视图)。在此之后,我从 40 辆汽车中的所有点中选择一个随机数,并从最接近该点数且观看次数最少的数组中抓取汽车。这样,PHP 会处理随机性以及视图部分和查询,因为您要求精确的数据非常快(每个 0.0006 秒)。