я чего-то не понимаю.
Есть тестовая таблица status_log:
CREATE TABLE `status_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rank` int(11) DEFAULT 50,
)
Заполняю её данными.
Делаю select:
select id,rank as rank,(rand()*100) as thres from status_log where rank = 50
Получаю 66 тысяч записей
| 6575236 | 50 | 80.0029963068692 |
| 6575286 | 50 | 34.903977657578864 |
| 6575476 | 50 | 34.51090244065123 |
| 6575511 | 50 | 67.84258230388404 |
| 6575589 | 50 | 35.68020727083106 |
| 6575644 | 50 | 74.87329251586766 |
| 6575723 | 50 | 67.32584384020961 |
| 6575771 | 50 | 12.009344726809621 |
| 6575863 | 50 | 58.06919518678374 |
+---------+------+-----------------------+
66169 rows in set (2.502 sec).
Теперь решаю отфильтровать по пороговому значению:
select * from (select id,rank as rank,(rand()*100) as thres from status_log where rank = 50) t where thres>rank order by thres;
Казалось бы, результатов должно быть в среднем 33000. Но нет, их в 2 раза меньше:
| 6320116 | 50 | 99.96190201487569 |
| 1042844 | 50 | 99.96344596144134 |
| 331390 | 50 | 99.96392289173224 |
| 6381040 | 50 | 99.97539855537508 |
| 3049964 | 50 | 99.97666422275515 |
| 3986559 | 50 | 99.9775216914504 |
| 2427419 | 50 | 99.978287797401 |
| 4396732 | 50 | 99.97966075314177 |
| 4001782 | 50 | 99.98002871869134 |
| 1788580 | 50 | 99.98064143581375 |
| 5300286 | 50 | 99.98275954274717 |
| 146401 | 50 | 99.98552389441573 |
| 4744748 | 50 | 99.98644758014609 |
+---------+------+--------------------+
16449 rows in set (2.188 sec)
Окей, меняем знак с "Больше" на "Меньше":
select * from (select id,rank as rank,(rand()*100) as thres from status_log where rank = 50) t where thres<rank order by thres;
Вывод:
| 5485599 | 50 | 49.96481263075472 |
| 968876 | 50 | 49.97663865795046 |
| 3613954 | 50 | 49.97714241033154 |
| 6263870 | 50 | 49.97751875778429 |
| 67389 | 50 | 49.97757910748718 |
| 4653786 | 50 | 49.98035016467827 |
| 6041489 | 50 | 49.980370281245904 |
| 5064204 | 50 | 49.989308742796354 |
| 1699741 | 50 | 49.991373205549436 |
| 3234039 | 50 | 49.99390454030959 |
| 806791 | 50 | 49.99575274996064 |
| 3713581 | 50 | 49.99814410693771 |
+---------+------+----------------------+
16562 rows in set (2.373 sec)
Опять 16000 значений! А где остальные 32000?
При этом, если я rand()*100 заранее подсчитываю и запихиваю в один столбец, то всё становится очевидно, всего по 32000.
При выборе rank=30 у меня распределение 6000 и 32000.
Где я продолбался?
Мб это https://bugs.mysql.com/bug.php?id=101101 https://bugs.mysql.com/bug.php?id=101108
я гляну, спасибо
Обсуждают сегодня