我需要获得2个随机行,但不仅仅是使用rand(),因为它对10k +行的性能非常不利,所以我从另一个问题得到了这个代码:
SELECT b.*
FROM bilder b CROSS JOIN
(SELECT COUNT(*) as cnt FROM bilder) v
WHERE rand() <= 5 / cnt
ORDER BY rand()
LIMIT 2
所以我从表bilder
得到2个随机行,现在性能要好得多。但我需要更多地指定它。我只需要字段geschlecht
得到值female
的行,所以我尝试了:
SELECT b.*
FROM bilder b CROSS JOIN
(SELECT COUNT(*) as cnt FROM bilder) v
WHERE rand() <= 5 / cnt AND geschlecht = 'female'
ORDER BY rand()
LIMIT 2
但是现在我有时只得到一排,有时却没有。我怎么能这样做?
答案 0 :(得分:0)
假设bilder
中有100行,但这些行中只有10行geschlecht='female'
。
第一个查询测试其随机选择100次,每次有5/100的机会选择该行。因此,选择 no 行的几率为0.95 100 (有关为什么看the Birthday Problem的解释),换句话说,只有0.5%的机会不选择任何行。< / p>
第二个查询仅测试其随机选择10次,并且每次仍有5/100的机会选择该行。选择 no 行的几率为0.95 10 ,这是59.87%的几率!
如果将条件应用于count子查询会更好:
SELECT b.*
FROM bilder b CROSS JOIN
(SELECT COUNT(*) as cnt FROM bilder WHERE geschlect = 'female') v
WHERE rand() <= 5 / cnt AND geschlecht = 'female'
ORDER BY rand()
LIMIT 2
现在cnt
只有10,因此随机几率是5/10选择行的几率。因此,不采摘行的几率为0.50 10 ,或小于0.1%。