连接 MySQL 中的两个表,从第一个表中选择随机行

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

我有两个表,表 2 每个变量有一行,而表 1 每个变量有很多行。我想从表 2(1000 个变量)中随机选择 1000 行,然后将它们连接到表 1。最终表每个变量将包含许多行。我还添加了从两个表中进行选择的条件。这是我的代码,但它没有从表 2 中选取 1000 个变量:

SELECT t1.var1, t1.var2, t2.var3, t2.var4
FROM table1 t1
RIGHT JOIN (SELECT var1, var3 FROM table2 ORDER BY RAND() LIMIT 1000) t2 
ON t1.var1 = t2.var2
WHERE t1.var2 < 90 AND t2.var4 = "asd";

我错过了什么? 另外,我已经测试了这个限制为 10 个变量,有时我得到零行......

mysql random
1个回答
0
投票

您的查询可以轻松过滤掉所有结果。

SELECT t1.var1, t1.var2, t2.var3, t2.var4
FROM table1 t1
RIGHT JOIN (SELECT var1, var3 FROM table2 ORDER BY RAND() LIMIT 1000) t2 
ON t1.var1 = t2.var2
WHERE t1.var2 < 90 AND t2.var4 = "asd";

这会在测试

t2.var4 = 'asd'
的行之前选择 1000 个随机行。我假设并非所有行都符合该条件。因此,随机选择的 1000 行中可能没有符合该条件。

此外,您还在外连接之后测试

t1.var2 < 90

,这意味着仅包含至少有一个与该范围条件匹配的 
t1
 对应行的 
t2
 行。这也造成了查询不返回结果的可能性,因为并非所有 
t1
 的行都有 
t2
 的对应行。

您应该能够解决这两个问题。

SELECT t1.var1, t1.var2, t2.var3, t2.var4 FROM table1 t1 RIGHT JOIN ( SELECT var1, var3 FROM table2 WHERE var4 = 'asd' ORDER BY RAND() LIMIT 1000 ) t2 ON t1.var1 = t2.var2 AND t1.var2 < 90;
这会将条件置于子查询内的 

t2.var4

 上,因此子查询会从匹配的行子集中返回 1000 个随机选择的行。

还将

t1.var2

 上的条件放入连接条件中意味着将返回 
t2
 的行,即使它们没有与该条件匹配的 
t1
 的对应行。

© www.soinside.com 2019 - 2024. All rights reserved.