【发布时间】:2014-07-26 11:19:09
【问题描述】:
我已经到处寻找答案,尽管人们说不要使用 ORDER BY RAND() 子句,但我认为就我的目的而言,这是可以的,因为这是一场几乎没有超过几百条记录的比赛每次比赛。
所以基本上我需要从竞赛条目表中检索 5 条随机记录。但是,任何忠诚度客户都会收到额外的额外条目,例如:
compEntryid | firstName | lastName | compID |
1 | bob | smith | 100
2 | bob | smith | 100
3 | jane | doe | 100
4 | sam | citizen | 100
等
因此,我们为忠诚会员提供了更好的获奖机会。但是我有点担心通常 ORDER BY RAND() 的返回结果可能包括同一个人的 2 个条目?什么是确保我们真正拥有 5 个随机记录但同时给那些额外的进入者更好或(加权)机会的优化方法?乐于使用多个查询、子查询甚至是 MySQL 和 PHP 的混合?任何建议都非常感谢谢谢!
贝斯
编辑:
这两个查询都有效!
查询1
SELECT concat(firstName, " ", lastName) name,id, email
FROM t WHERE
RAND()<(SELECT ((5/COUNT(id))*10) FROM t)
group by email ORDER BY RAND() limit 5;
查询2
select distinct
email, id, firstName, lastName from
(
select id ,
email, firstName , lastName , compID, rand()/(select count(*) from t where
email=t1.email
) as rank
from t t1
where compID = 100
order by rank) t2 limit 5;
【问题讨论】:
-
你可以使用
DISTINCT() -
使用 distinct 的查询会是什么样子?同样在我的架构中,ID 之间可能存在漏洞,但是无论 ID 是什么,它们都是连续的?
-
我不相信这是重复的。提供链接的已发布响应是针对不同(且更简单)的问题,即仅获取随机记录。这个问题想要没有重复的随机记录,但会根据条目的重复数返回随机记录。
-
虽然它与那个问题相似,但该特定解决方案适用于 ONE 记录,如果您要通过 PHP 循环运行它,那么在您的迭代中很有可能再次获得相同的参赛者否则您将不得不记录每个随机生成的数字并检查它是否已经在您的 5 个随机数字池中,我觉得这可以单独使用 SQL 完成,并且只需尝试协商一个答案,我希望这是有道理的.