我有一张城市表:“名字”和“人口”。 我想随机选择一个城市,但总是以人口为基础。
纽约 - 19.000.000 城市2 - 1.000.000
如此随机我获得“纽约”的机会比“城市2”多19倍。
当然,这张桌子还有更多的城市。
答案 0 :(得分:2)
要随机选择按人口加权的记录,这将有效:
SELECT * FROM tablename ORDER BY (RAND() * population);
添加LIMIT只允许一个,按人口随机挑选和加权:
SELECT * FROM tablename ORDER BY (RAND() * population) LIMIT 1;
答案 1 :(得分:0)
数学上看起来很棒。
但是我在表格中插入了300k个随机城市。大约90%的城市人口最多。 这个城市仅占全国总人口的5%。所以我得到了一个非常奇怪的结果。
也许mysql正在缓存RAND()或者什么......我不知道。
我自己做了这个sql,我的测试非常正确。
SELECT @som := 0, @sorted := FLOOR( RAND()*(SELECT SUM(population) FROM cities ) );
SELECT ord.id, ord.initial, ord.final FROM
(
SELECT
id, @som+1 AS initial, @som := @som + population AS final
FROM cities
) ord
HAVING @sorted
BETWEEN
ord.initial AND ord.final;