首页 > 解决方案 > 为什么 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 条记录。

找不到任何关于此的解释。
任何想法都会有所帮助

在此处输入图像描述

标签: mysqlrandom

解决方案


在生产上也面临同样的问题。(https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=cce1976b3a98982fe002727fa994902d

所以,我发现了什么。它可以通过以下方式重现:

  1. Mysql 版本 5.*. (它固定在 8 上)。
  2. 仅在LEFT JOIN上发生
  3. 它可以id int auto_increment primary key在可连接表上重现。
  4. 连接必须不包含交集

结果 - RAND()机会被应用了两次。

作为解决方案:使用WHERE T1.ID NOT IN (SELECT ...). 它将在不影响主查询的子查询中运行连接。


推荐阅读