Как реализовать оператор MySQL, похожий на цикл? - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть одна таблица1, имеет поле, как показано ниже.

rsid  pos
123   10000
234   10001
567   10008

и другая таблица2 имеет только одно поле

rsid
123
345
...

Итак, моя цель - найти rsids, позиция которых находится в определенном диапазоне. например, я хочу найти rsid в table1, позиция которого находится в пределах + - 10000 позиций rsids в table2, например 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; 

но в таблице 2 есть тысячи строк, и, наконец, я хочу объединить все квалифицированные rsid в одну таблицу, есть ли способ, как цикл объединяет все результаты? Большое спасибо за вашу помощь?

UPDATE
Спасибо за ваш добрый ответ. Более конкретный пример будет как ниже. Предположим, в таблице 1 есть только следующие записи.

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

и другая таблица2 содержит только такие записи.

rsid
123
100

Тогда ожидаемый результат будет

rsid  pos
234   10001
567   10008
101   20001

, потому что 234 567 находятся в пределах + -10000 от 123, а 101 находятся в пределах + -10000 от 101.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011
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);
0 голосов
/ 11 декабря 2011

Должен признать: я не совсем понимаю вопрос. так вот что я думаю, что вы имеете в виду:

1) найти все RSID в пределах 100 000 от определенного RSID

2) создать эти результаты в новой таблице. (какие циклы и объединения не нужны, если вы просто используете таблицу создания из синтаксиса выбора.

3) Не уверен, что table2 имеет отношение к чему-либо, но я думаю, что вам нужны только позиции RSID, которые существуют как в table1, так и в table2.

    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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...