当前位置: 首页 > 面试题库 >

大表中的SQL随机行(带有where子句)

东方国安
2023-03-14
问题内容

我有一个网站,人们可以在上面投票。向用户显示了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()语句获取它们。您将不会比这更有效率。



 类似资料:
  • 问题内容: 是否可以在WHERE子句中使用LIMIT x? 如果是这样,怎么办? 我正在尝试这样做: 但我收到以下错误: 问题答案: 应该在之后。 句法 :

  • 问题内容: 我有以下SQL代码(这是到目前为止我得到了多少): 以下是VIEW_1的定义: 但是我收到以下错误消息: 是什么导致错误?在哪里更改代码以使其起作用? 感谢您的帮助! 问题答案: 以我的经验,不仅在USING子句为MATCH表中的一行返回一行以上时,而且在无法 确定 仅返回一行(即使没有实际的行)时,也会返回此错误。返回多行的情况)。为了在这种情况下强制解析器接受查询,我通常会在MAT

  • 问题内容: 我将如何在没有硬编码值的情况下编写此sql语句? 宁愿有这样的事情: 提前致谢.. 问题答案: 用您当前的方式构造SQL查询是一个糟糕的主意,因为它为各种SQL注入攻击打开了大门 。为了正确执行此操作,您必须改为使用“ 预备语句”。这也将解决您目前显然遇到的各种逃避问题。 请注意,这是一个昂贵的调用(除非您的应用程序服务器使用语句缓存和其他类似的功能)。从理论上讲,最好先准备一次语句,

  • 问题内容: 这是我的项目表 这是我的发货表 我想为提供最小数量的项目命名。 我试过了。但是它只返回最小数量值,这是我的代码 问题答案:

  • 问题内容: 我有下表 SQLFiddle 我试图做的是选择三个随机图像,但是要确保没有两个图像具有相同的对象,我试图做的是将GROUP BY和ORDER BY rand()一起执行,但是失败了。它总是给我cat1.jpg,dog1.jpg,box1.jpg(所有路径以1结尾而不是其他路径结尾的图像) 小提琴包括我运行的查询及其运行方式。 问题答案: 您需要的是一个随机聚合函数。通常,当前的RDBM

  • 问题内容: 我正在为学校项目这样做(因此我不能使用任何高级功能),并且我正在使用Python 2.6.6。 我有一个从1到1000的数字列表,我的种子将是448。 如何使用该种子生成随机序列,以便列表中的数字位于不同的索引中? 知道种子后,是否有可能将列表中的元素返回到初始位置? 抱歉,如果我的问题令人困惑,但是英语不是我的母语。 谢谢。 问题答案: 结果是 您的列表现已伪随机化。 “伪”很重要,