php – SQL大表中的随机行(带where子句)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – SQL大表中的随机行(带where子句),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3179字,纯文字阅读大概需要5分钟。
内容图文
我有一个人们可以在汽车上投票的网站.向用户展示了4辆汽车,他/她可以对他们最喜欢的汽车进行投票.
桌车有重要的列:
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具有无间隙的PK.我选择映射表的最大ID并创建4个随机数(PHP),从映射中选择那些行并获取相应的car_id.这些数字我用来从汽车表中选择汽车.
问题是后来添加到数据库中的汽车获得与之前添加的汽车相同点的机会较少.
我的问题是如何显示4辆具有相同数量的点(随机)的车辆,这些点数由最少的视图(视图asc)排序.重要的注意事项:
>选择应仅查询至少有1个点的汽车.
>数据库将包含超过30M的汽车,它不是关于汽车,但对于这个问题,我认为它更容易:).
>当70%的汽车有1分,20%有2分,10%有3分,比随机分数应该选择汽车70%的时间,1分20%,2分,10%,3分.
>查询将用于向访客显示4辆车,我们都知道用户不耐烦所以查询越快越好:)
>我可以(如果需要)使用映射表,它在PK中没有间隙(正如我现在所做的那样).
>将显示仅在某种car_type内的汽车.例如,4辆车的2型(家用车),因为我不想同时展示跑车和家用车.
如果您知道另一个解决上述问题的解决方案,我愿意接受所有类型的解决方案(PHP / SQL).
赏金,因为这是一个比平均Stackoverflow问题更大的问题(/答案).赏金将奖励给描述解决方案的人或(优选)解决方案的代码.无论如何,这是我感谢帮助我的人并确保我非常感谢你的帮助的方式.
更新:
谢谢你到目前为止的所有答案!你的答案很好.我在过去的几个小时里确实考虑了很多,我开始意识到数据库实际上从来没有为这样的事情构建(显示随机数据),它是为了显示精确和准确的数据而快速访问.这就是为什么在具有30M或更多行的PK上选择仍然非常快.这就是为什么我在考虑用PHP做所有随机的东西.因此,我在PHP中生成40个随机数,并从右侧车型的映射表中选择那40行. IN的选择非常快(如0.0006秒).在这个选择之后,我得到了40个car_ids,我也从汽车表中选择了IN.我循环汽车并将它们放在一个数组中并做一些自定义排序(基于点和视图).在此之后,我从40辆汽车中的所有点中选择一个随机数,并从距离这个点数最近并且视图最少的阵列中抓取汽车.这样,PHP可以处理随机性和视图部分以及查询,因为您要求的精确数据非常快(每个0.0006秒).
解决方法:
我想给出一个具体的答案,但我需要帮助才能理解你的思考过程……
你从写作开始:
I have a website where people can vote on (…) the car they like most.
The problem is that cars added later to the database have less chance to get on the same points as cars added earlier.
但是你继续写下:
When 70% of the cars have 1 points, 20% have 2 points and 10% have 3 points, than the random points should select cars 70% of the time with 1 point 20% with 2 points and 10% with 3 points.
对我来说,根据第一句话,后一个规范没有多大意义.
Imho,你真正想要的是让用户拥有相同数量的投票机会.或者更确切地说,投票支持每辆车相对于彼此的汽车.
如果您认为(汽车)变量是独立的,那么您需要计算一个选择出现的次数,而不是投票的次数,并相应地调整您的决策过程.这是一个数学问题,它不是那么难看,然后它可以被转化为SQL,无论好坏 – 我冒昧地认为它可能会更糟.
如果你像我一样假设他们不是独立的,你还需要考虑相关性 – 并存储他们彼此相遇的次数.因为,有一个非常微小的机会,你不会喜欢这个梅赛德斯,而不是塔塔,新凯或那个AvtoVAZ.但考虑到梅赛德斯,宝马,保时捷和法拉利之间的选择,决定可能并不那么明确.
换句话说,你的规范并没有像你提出的那样回答问题.
我现在乞求同意两小时前发布的答案:选择它们真的是随机的,你会满意而不需要额外的代码……
作为旁注,如果您的ID确实没有间隙,请在php或其他任何内容中生成四个ID,并使用in()语句获取它们.你不会比那更有效率.
内容总结
以上是互联网集市为您收集整理的php – SQL大表中的随机行(带where子句)全部内容,希望文章能够帮你解决php – SQL大表中的随机行(带where子句)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。