mysql - 为什么 Mysql Rand() 在使用左连接时有不同的行为
问题描述
我正在尝试在 mysql(Mac 和 Linux 上的 v5.7)查询中实现一些模糊的东西,但意识到 mysqlRand()
在使用/不使用带有空表的左连接时有一个奇怪的行为!
为了重现这一点,我制作了 2 个表,t1 有 1000 条记录,t2 没有记录。
然后我尝试运行这两个查询:
SELECT count(*) FROM t1 LEFT JOIN t2 ON t1.id = t2.id WHERE RAND() < 0.5;
SELECT count(*) FROM t1 WHERE RAND() < 0.5;
第一个查询返回约 250 条记录,但第二个查询返回约 500 条记录。
找不到任何关于此的解释。
任何想法都会有所帮助
解决方案
在生产上也面临同样的问题。(https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=cce1976b3a98982fe002727fa994902d)
所以,我发现了什么。它可以通过以下方式重现:
- Mysql 版本 5.*. (它固定在 8 上)。
- 仅在LEFT JOIN上发生
- 它可以
id int auto_increment primary key
在可连接表上重现。 - 连接必须不包含交集。
结果 - RAND()机会被应用了两次。
作为解决方案:使用WHERE T1.ID NOT IN (SELECT ...)
. 它将在不影响主查询的子查询中运行连接。
推荐阅读
- spring - 如何使用 spring-data-ldap 对 ladp 用户进行身份验证?
- javascript - 如何根据从下拉列表中选择的项目设置范围
- javascript - 是否可以通过单击网站上的按钮来启动 android 应用程序
- nosql - 为什么 DynamoDB 不支持简单聚合?
- sql - Redshift:如何创建使用查找表的函数
- javascript - 将变量从 HTML 页面传递到另一个 PHP 页面
- powershell - 返回多个目录的最底层目录
- c++ - 使用该类的其他成员变量定义类的成员变量数组
- r - 使用 purrr 和 mutate 向数据框添加多列
- python - 如何在 Python 中使用 API 中的数据来访问另一个 JSON 文件中的数据?