Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL内部连接范围查询的困难_Mysql_Sql - Fatal编程技术网

MySQL内部连接范围查询的困难

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

我真的在为一个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 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:ON
    bb.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