我有两个表,表 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 个变量,有时我得到零行......
您的查询可以轻松过滤掉所有结果。
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
的对应行。