MySQL,任何人都可以解释一下我在这里做错了什么:
select ROW_NUMBER() OVER (
ORDER BY id
) row_num, r, r > '0.5', r > '0.2', r > '0.1',
CASE
WHEN r > '0.5' THEN '0.5'
WHEN r > '0.2' THEN '0.2'
WHEN r > '0.1'THEN '0.1'
ELSE '0'
END as 'actual'
from (select id, rand() r from users) t;
结果:
1 0.3050642603124159 1 1 1 0.5
2 0.03457492965699633 0 1 0 0.5
3 0.8674438212695008 0 1 1 0.5
4 0.077966298980607 1 1 1 0.2
5 0.3282627941372458 0 0 1 0.5
6 0.2562537558900693 0 1 1 0.2
7 0.017397192323018975 0 1 0 0.2
8 0.5937670381681687 0 1 1 0.5
9 0.1845749962931266 0 1 1 0.2
10 0.8352527859017744 0 1 1 0.2
11 0.9591796351216544 1 0 1 0.2
12 0.05485615977538392 1 1 1 0.2
13 0.8754085310505783 1 1 1 0.5
14 0.7607530902705649 0 1 1 0.2
15 0.07947531070511352 0 1 0 0.2
16 0.7614915275587621 0 1 1 0.2
17 0.4879049840270588 0 1 1 0.5
18 0.5419163830037381 0 1 1 0.2
19 0.5332705336932749 0 1 1 0.5
20 0.9298071674348853 0 1 1 0.2
21 0.29434789651478444 1 1 1 0.2
22 0.10249882294097806 1 1 1 0.5
23 0.7074116633342687 1 1 1 0.5
24 0.5250272765057415 0 1 1 0.5
25 0.5142364888584581 1 1 1 0.5
26 0.9172307084474999 1 1 1 0.2
测试返回值根本不是我所期望的。 如果我以第一行为例,我会期望:
1 0.3050642603124159 1 1 0 0.2
而不是:
1 0.3050642603124159 1 1 1 0.5
我完全迷失了。 感谢您的帮助,这简直要了我的命。
@ErgestBasha 这是:
CREATE TABLE `users` (
`id` char(36) NOT NULL,
`user_name` varchar(60) DEFAULT NULL,
`user_hash` varchar(255) DEFAULT NULL,
`system_generated_password` tinyint(1) DEFAULT NULL,
`pwd_last_changed` datetime DEFAULT NULL,
`authenticate_id` varchar(100) DEFAULT NULL,
`sugar_login` tinyint(1) DEFAULT '1',
`first_name` varchar(30) DEFAULT NULL,
`last_name` varchar(30) DEFAULT NULL,
`is_admin` tinyint(1) DEFAULT '0',
`external_auth_only` tinyint(1) DEFAULT '0',
`receive_notifications` tinyint(1) DEFAULT '1',
`description` text, `date_entered` datetime DEFAULT NULL,
`date_modified` datetime DEFAULT NULL,
`modified_user_id` char(36) DEFAULT NULL,
`created_by` char(36) DEFAULT NULL,
`title` varchar(50) DEFAULT NULL,
`photo` varchar(255) DEFAULT NULL,
`department` varchar(50) DEFAULT NULL,
`phone_home` varchar(50) DEFAULT NULL,
`phone_mobile` varchar(50) DEFAULT NULL,
`phone_work` varchar(50) DEFAULT NULL,
`phone_other` varchar(50) DEFAULT NULL,
`phone_fax` varchar(50) DEFAULT NULL,
`status` varchar(100) DEFAULT NULL,
`address_street` varchar(150) DEFAULT NULL,
`address_city` varchar(100) DEFAULT NULL,
`address_state` varchar(100) DEFAULT NULL,
`address_country` varchar(100) DEFAULT NULL,
`address_postalcode` varchar(20) DEFAULT NULL,
`deleted` tinyint(1) DEFAULT NULL,
`portal_only` tinyint(1) DEFAULT '0',
`show_on_employees` tinyint(1) DEFAULT '1',
`employee_status` varchar(100) DEFAULT NULL,
`messenger_id` varchar(100) DEFAULT NULL,
`messenger_type` varchar(100) DEFAULT NULL,
`reports_to_id` char(36) DEFAULT NULL,
`is_group` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_name` (`user_name`,`is_group`,`status`,`last_name`,`first_name`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
显然 MySQL 通过将主查询中
r
的每个实例替换为 RAND()
来“优化”这一点,因此每次都会比较不同的随机数,并且会得到不一致的结果。
解决方法是创建一个临时表,将特定的随机数与每个 ID 相关联:
CREATE TABLE users_rand (
id INT PRIMARY KEY,
r DOUBLE
);
INSERT INTO users_rand
SELECT id, RAND()
FROM users;
SELECT ROW_NUMBER() OVER (
ORDER BY id
) row_num, r, r > 0.5, r > 0.2, r > 0.1,
CASE
WHEN r > 0.5 THEN 0.5
WHEN r > 0.2 THEN 0.2
WHEN r > 0.1THEN 0.1
ELSE 0
END as actual
FROM users_rand;