2017-07-27 87 views
0
SELECT 
    table1.a, 
    table1.b, 
    (SELECT b 
    FROM table2 
    WHERE table2.b - table1.a < 10 
    LIMIT 0,1) as test 
FROM table1 
WHERE table1.b < test; 

我想用我的查询的WHERE部分中选择“变量” 测试收到的结果计算出的值。MySQL的重新使用WHERE子句

任何想法如何做到这一点,而不必重做计算或WHERE再次?这就是我设法使其工作到目前为止。

+0

不可能,您不能在WHERE子句中使用别名。但只是在WHERE子句中重复完全相同的计算通常不是问题,它会在内部进行优化,以便计算仅发生一次。 – CBroe

回答

0

你不能在WHERE中使用它,但你可以使用HAVING。你有你的结果。但那不是很高效。

SELECT table1.a, table1.b, 
    (select b FROM table2 WHERE table2.b-table1.a<10 LIMIT 0,1) as test 
FROM table1 
HAVING table1.b<test 

如果你想使用WHERE,那么你必须在这个位置来创建子选择太

SELECT table1.a, table1.b, 
    (select b FROM table2 WHERE table2.b-table1.a<10 LIMIT 0,1) as test 
FROM table1 
WHERE table1.b < (select b FROM table2 WHERE table2.b-table1.a<10 LIMIT 0,1) 
+0

我不能做这样的事情'SELECT table1.a,table1.b, @test:=(select b FROM table2 WHERE table2.b-table1.a <10 LIMIT 0,1)as test FROM table1 WHERE table1.b <@ test' – blackswan

0

我想,只要你想这个查询将给结果。

SELECT table1.a , 
table1.b , 
table2.b 
FROM table1 , 
table2 
WHERE 
table1.b < table2.b AND 
(table2.b - table1.a) < 10 
0

test variabel等于table2.b那的值小于table1.a +10。因此,可以将查询转换为

SELECT 
    table1.a, 
    table1.b, 
    table2.b AS test 
FROM table1 
JOIN table2 
ON (table2.b - table1.a < 10) AND (table1.b < table2.b) 
GROUP BY table1.a, table1.b; 

GROUP BY子句在这里用来防止table1.atable1.b组合重复,并获得每个table1.atable1.b组合只是第一table2.b值。