MySQL内部连接范围查询的困难
我真的在为一个MySQL查询苦苦挣扎,我真的希望有人能帮助我。我在MySQL数据库中有三个表——表a、B和C。我想从表a的第1列(a.1)中找到与表B的第2列(B.2)中的值相匹配的所有值。然后,对于每个b.2匹配,在表b中找到a.1匹配b.2的行中,在b.3中找到的整数值+/-100范围内的所有其他b.2值。最后,我需要获取这些b.2值,并在表C第4列中找到匹配的b.2值 以下是我尝试执行查询的方式:MySQL内部连接范围查询的困难,mysql,sql,Mysql,Sql,我真的在为一个MySQL查询苦苦挣扎,我真的希望有人能帮助我。我在MySQL数据库中有三个表——表a、B和C。我想从表a的第1列(a.1)中找到与表B的第2列(B.2)中的值相匹配的所有值。然后,对于每个b.2匹配,在表b中找到a.1匹配b.2的行中,在b.3中找到的整数值+/-100范围内的所有其他b.2值。最后,我需要获取这些b.2值,并在表C第4列中找到匹配的b.2值 以下是我尝试执行查询的方式: SELECT * FROM TableB AS b INNER JOIN TableA
SELECT *
FROM TableB AS b
INNER JOIN TableA AS a ON b.2 = a.1
AND b.3 >= (b.3 - 100)
AND b.3 <= (b.3 + 100)
INNER JOIN TableC as c
ON b.2 = c.4;
选择*
从表b到表b
b.2=a.1上作为a的内部联接表a
和b.3>=(b.3-100)
在回答之前,我们需要知道发生了什么。它有用吗?它生产什么?有错误吗
无论如何,这里是我的猜测(另外,我假设您不使用像1、2或3这样的列名,这只是为了演示的目的):
唯一的更改是表A的联接条件。您的更改应该是语法错误。我简化了between条件。根据您的描述,我提取了这个查询:
SELECT a.one, b.three, c.four
FROM a
JOIN b AS b0 ON b0.two = a.one -- intermediary step
JOIN b ON b.three BETWEEN b0.three - 100
AND b0.three + 100 -- real b values
JOIN c ON c.four = b.two
我在您的查询中看到的问题:
- 您在a.1=b.2上有
其中a.1=b.2
它应该在哪里
- 在最后一个连接中,您在bb.3=c.4
上有,而根据您的描述,它必须在bb.2=c.4
上
如果您的描述错误,而您的演示正确,则我们可以简化为:
有什么问题?这个查询似乎代表了您所陈述的内容。b-bb连接中是否存在性能问题?否则的话,看起来还可以。顺便说一下,我通常发现中间比较值更容易读取中间值,Simple值应该是“哪里”不是“on”?它应该是< <代码> > <代码> > <>代码>当你加入TabLAMY查询工作时,它只返回第一个内部连接的结果。由于某种原因,范围查询似乎不起作用?您的查询应该只产生语法错误。@ypercube:query是正确的。不需要额外的别名。但要摆脱horiz。标尺是受欢迎的。之所以需要标尺,是因为在c.four=b2上有连接c。在最后一个连接中有两个。您使用的是b2
。但是我不会再搅乱你的查询了。@ypercube:我在SELECT中只使用了a.one,b.three,c.four
,因为b.two
与c.four
相同,b0.two
与a.one
相同。是的,好的,这是个小问题。OP可能希望显示其他数据。我只是觉得同时显示b0.three
和b.three
会很好(用于调试)。@ypercube:我明白了,这是有道理的。但这里确实是偶然的。您的查询复制了OP:ONbb.3=c.4
的错误。如果这是正确的,您可以省略TableB
上的第二个联接,直接联接TableC
。然而,根据OP的描述(现在也是图表),在最后的连接中,它应该是在bb.2=c.4
上。是的,我承认我没有深入讨论这个问题。一开始我不明白哪里出了问题,我的回答是希望能从OP那里得到更多的信息。谢谢你纠正我的错误,我很感激。
SELECT a.one, b.three, c.four
FROM a
JOIN b AS b0 ON b0.two = a.one -- intermediary step
JOIN b ON b.three BETWEEN b0.three - 100
AND b0.three + 100 -- real b values
JOIN c ON c.four = b.two
SELECT a.one, b.three, c.four
FROM a
JOIN b ON b.two = a.one
JOIN c ON c.four BETWEEN b.three - 100 AND b.three + 100