大表中的SQL随机行(带有where子句)
我有一个网站,人们可以在上面投票。向用户显示了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
表中选择汽车。
问题 在于,后来添加到数据库中的汽车与先前添加的汽车获得相同分数的机会较小。
我的问题 是如何显示按最少视图数(asc视图)排序的点数(随机)相同的4辆汽车。还有重要的注意事项:
- 选择只能查询 至少 1分的汽车。
- 该数据库将包含超过3000万辆汽车,这与汽车无关,但我认为这个问题更容易:)。
- 当70%的汽车有1分,20%的汽车有2分,10%的汽车有3分时,随机分数应该选择70%的汽车有1分,20%的有2分和10%的3分。
- 该查询将用于向访客显示4辆汽车,我们都知道用户不耐烦,因此查询越快越好:)
- 我可以(如果需要)使用一个映射表,该映射表在PK中将没有任何间隙(如我现在所述)。
- 仅 显示特定car_type内的汽车。例如,由于我不想同时展示跑车和家用车,所以有2种类型2的汽车(家用车)的4个随机数。
如果您知道 用于解决上述问题的另一种解决方案,我将愿意接受所有类型的解决方案(PHP / SQL)。
赏金,因为 它是一个比平均Stackoverflow问题更大的问题(/
answer)。赏金将奖励给描述解决方案或(首选)解决方案代码的人员。无论如何,这是我感谢帮助我的人并确保我非常感谢您的帮助的方式。
更新:
到目前为止,感谢您提供所有答案!您的回答没事。我确实想了很多关于它的最后几个小时,我开始认识到,数据库实际上从来没有建立这样的事情(显示 随机
数据),它的建立是为了显示 精确 和 准确
快速访问数据。这就是为什么在具有30M行或更多行的PK上选择仍然非常快的原因。这就是为什么我要考虑在PHP中做所有随机的事情。因此,我在PHP中生成了40个随机数,然后从正确的汽车类型的映射表中选择了这40行。此选择IN
确实非常快(例如0.0006秒)。选择之后,我得到了40个car_id,我也选择了IN
从汽车表。我循环行驶汽车,并将它们排列成阵列,然后进行一些自定义排序(基于点和视图)。此后,我从40个汽车中的所有点中选择一个随机数,然后从最接近该点数且视图最少的阵列中获取汽车。这样,PHP会处理随机性,视图部分和查询,因为您要求精确的数据非常快(每个请求都需要0.0006秒)。
-
我想给出一个具体的答案,但我需要帮助来了解您的思考过程…
您首先编写:
我有一个网站,人们可以在该网站上投票选择他们最喜欢的汽车。
问题在于,后来添加到数据库中的汽车与先前添加的汽车获得相同分数的机会较小。
但是然后您继续写作:
当70%的汽车有1分,20%的汽车有2分,10%的汽车有3分时,随机分数应该选择70%的汽车有1分,20%的有2分和10%的3分。
对我来说,鉴于第一个评论,后一个规范毫无意义。
恕我直言,您真正想要的是让用户在每辆汽车上拥有相同数量的投票机会。或更准确地说,是将每辆车投票给对方。
如果您假设(汽车)变量是独立的,那么您需要计算一个选择出现的次数,而不是该选择被投票的次数,并相应地调整决策过程。这是一个数学问题,不是那么丑陋,然后可以将它翻译成SQL变得更好或更坏-
我敢冒险,情况可能会变得更糟。如果您像我一样假设它们不是独立的,则还需要考虑相关性,并存储它们相互提出多少次。因为,那么,您将无限可能会选择奔驰而不是塔塔,新凯或AvtoVAZ。但是,如果要在相同的梅赛德斯,宝马,保时捷和法拉利之间进行选择,这一决定可能不会那么明确。
换句话说,您的规范根本无法解决问题。
我目前希望同意两个小时前发布的答案:随机选择它们,而无需额外的代码,您会感到满意…
附带说明一下,如果您的ID确实没有空格,请在php或其他任何方式中生成四个ID,然后使用一条
in()
语句获取它们。您将不会比这更有效率。