如何实现类似于循环的MySQL语句?

时间:2011-12-11 02:50:32

标签: mysql sql loops union

我有一个table1,有如下字段。

rsid  pos
123   10000
234   10001
567   10008

另一个table2只有一个字段

rsid
123
345
...

所以,我的目标是找到位置在一定范围内的rsids。 例如,我想在table1中找到rsid,其位置在table2中rsids的+ - 10000位置,例如123.

我可以为特定行编写sql,如下所示

select *
from table1
where pos > (select pos from table1 where rsid=123)-100000
  and pos < (select pos from table1 where rsid=123)+100000; 

但是在table2中,有成千上万的行,最后我想将所有合格的rsid合并到一个表中,有没有像循环一样联合所有结果? 非常感谢你的帮助?

更新
感谢您的回复。更具体的例子如下所示。假设table1只有以下条目。

rsid  pos
123   10000
234   10001
567   10008
100   20015
101   20001
108   50000

和另一个table2只有这样的条目。

rsid
123
100

然后预期结果将是

rsid  pos
234   10001
567   10008
101   20001

因为234,567在123的+ -10000范围内,101在101的+ -10000范围内。

2 个答案:

答案 0 :(得分:0)

必须承认:我真的不明白这个问题。 所以这就是我的意思:

1)查找特定RSID的100,000以内的所有RSID

2)将这些结果创建到新表中。 (如果您只是使用select语法中的create table,则不需要循环和union。

3)不确定table2与什么有关,但我认为你只需要在table1和table2中都存在的RSID位置。

    Create table NEWTable
    Select RSID, pos
    from table1 t1
    INNER JOIN table2 t2 on t1.RSID = T2.RSID
    WHERE t1.pos between  
      (select pos from table1 where rsid=123)-100000 
  and (select pos from table1 where rsid=123)+100000; 

答案 1 :(得分:0)

select t1.pos from 
(select distinct t1.pos from t1 join t2 
 where t1.pos between t2.pos-20000 and t2.pos+20000) t1 
where t1.pos not in (select * from t2);