返回基于一系列值的结果,即WHERE ColA =(ColB + n OR ColB - n)

时间:2015-05-31 13:44:44

标签: mysql range where

我对以下内容感到有些困惑,请问您可以向我们寻求方向吗?

我创建了2个临时表'compare1'和'compare2',我想列出表之间常见的单词。

但是,在每个临时表中,我都有一个数字字段'chunkIdx',它表示单词的位置。我想将我列出的结果限制在该位置的特定范围内。

让我先告诉你我的结果,然后解释他们的错误......

tSpan   wLen    aSize   c1_chunkIdx word    tSpan   wLen    aSize   c2_chunkIdx word
5       7       6       0           daa     5       7       6       43          daa
5       8       7       1           baa     5       8       7       44          baa
5       7       6       1           baa     5       7       6       1           baa

在上面列出的结果中,我只想要第3行。因为c2_chunkIDx值在c1_chunkIDx - 5和c1_chunkIDx + 5之间。显然,第1行和第2行将无法通过此测试。

我以为我可以包含类似的东西......

WHERE (c2.chunkIdx BETWEEN (c1.chunkIdx - 5) AND (c1.chunkIdx + 5))

或者也许......

WHERE (c2.chunkIdx >= (c1.chunkIdx - 5) OR c2.chunkIdx <= (c1.chunkIdx + 5))

在我的WHERE子句中,但这样做什么都不返回。字面上没有结果选项卡甚至可以查看空数据集(我正在使用HeidiSQL)。这就像查询从未被解雇过,我甚至没有收到错误消息。

显然我错过了一些东西(除了结果)。

我的完整查询如下所示。

SELECT c1.tSpan, c1.wLen, c1.aSize, c1.chunkIdx AS C1_ChunkIdx, c1.word,
       c2.tSpan, c2.wLen, c2.aSize, c2.chunkIdx AS C2_ChunkIdx, c2.word
FROM compare1 c1
    INNER JOIN compare2 c2 ON c1.word = c2.word
WHERE (c2.chunkIdx BETWEEN (c1.chunkIdx - 5) AND (c1.chunkIdx + 5))
    AND c1.tSpan = c2.tSpan
    AND c1.wLen = c2.wLen
    AND c1.aSize = c2.aSize

请问,我怎样才能将结果限制在基于c1.chunkIdx字段值的范围内?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

答案似乎是使用变量

SELECT c1.tSpan, c1.wLen, c1.aSize, c1.chunkIdx AS C1_ChunkIdx, c1.word,
   c2.tSpan, c2.wLen, c2.aSize, c2.chunkIdx AS C2_ChunkIdx, c2.word
, @lowChunk := (c1.chunkIdx - 5)
, @highChunk := (c1.chunkIdx + 5)
FROM compare1 c1
    INNER JOIN compare2 c2 ON c1.word = c2.word
WHERE c2.chunkIdx BETWEEN @lowChunk AND @highChunk
    AND c1.tSpan = c2.tSpan
    AND c1.wLen = c2.wLen
    AND c1.aSize = c2.aSize

这似乎给了我我需要的东西。我不是一个强大的SQL人,所以我无法解释为什么会这样。