看不懂MySQL中的CASE、test、RAND

问题描述 投票:0回答:1

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
1个回答
0
投票

显然 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;
© www.soinside.com 2019 - 2024. All rights reserved.