2014-02-02 2 views
1

У меня есть две колонки: amountFrom, amountTo в таблице shippingИзбегайте пересечения диапазона веса МЕЖДУ, с двумя колоннами? MySQL

Допустим, у меня есть эти строки данных:

amountFrom | amountTo 
----------------------- 
0   15 
16   30 
31   50 

Теперь я хотел бы добавить эти три:

amountFrom | amountTo 
----------------------- 
15   22 (should fail, already exist (crosses range)) 
18   25 (should fail, already exist) 
55   76 (should pass) 

Как могу ли я сделать правильный SQL-запрос, который будет выполняться для каждой строки, которую я хотел бы вставить, которая проверит, доступен ли «диапазон»?

Пример того, что я пытался

SELECT id FROM shipping WHERE amountFrom >= 15 AND amountTo <= 22 

Над запрос не возвращает ни одной строки, которые он должен (если это был правильный запрос), так как мы не хотим, чтобы сделать новую строку с 15 и 22, как это будет перекрестные существующие диапазоны веса

+0

Похоже, вам нужен диапазон для * каждой колонки. – Kermit

+0

Итак, в основном вы спрашиваете, как проверить, перекрываются ли два интервала? http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap –

ответ

0

Вам не нужно делать три отдельных вставок. Вы можете сделать их все сразу (по крайней мере, с данными в вашем запросе).

ЗЕЬЕСТ, чтобы увидеть, не перекрывают друг друга является:

select t2.* 
from table2 t2 
where not exists (select 1 
        from table1 t1 
        where t1.amountFrom <= t2.amountTo and 
         t1.amountTo >= t2.amountFrom 
       ); 

двух диапазонов перекрывается, если одна начинается раньше других целей, и первые концы после других запусков.

Вы помещаете это в insert как

insert into t1(amountFrom, amountTo) 
    select t2.amountFrom, t2.amountTo 
    from table2 t2 
    where not exists (select 1 
         from table1 t1 
         where t1.amountFrom <= t2.amountTo and 
          t1.amountTo >= t2.amountFrom 
        ); 

EDIT:

Если вы хотите сделать это по одной строке за раз, и предотвратить дублирование в новых строк, а также:

insert into t1(amountFrom, amountTo) 
    select t2.amountFrom, t2.amountTo 
    from (select XX as amountfrom, YY as amountTo 
     ) t2 
    where not exists (select 1 
         from table1 t1 
         where t1.amountFrom <= t2.amountTo and 
          t1.amountTo >= t2.amountFrom 
        ); 

Это сделает шаг в один шаг за раз с логикой перекрытия.

+0

что вы делаете? есть только одна таблица. –

+0

@KarolyHorvath. , , Я предполагаю, что три строки, которые нужно вставить в формат таблицы в OP, на самом деле являются второй таблицей. –

+0

вы, вероятно, ошибаетесь. в любом случае .. Я думаю, это предполагает, что во второй таблице нет совпадений. –

1

Вы можете попробовать это (здесь со значениями 15 и 22):

INSERT INTO t (amountFrom, amountTo) 
SELECT 15, 22 
WHERE NOT EXISTS (SELECT 1 FROM t WHERE 22 >= amountFrom AND 15 <= amountTo); 

Вы можете проверить затронутую-строк значение, чтобы увидеть Wether или не строка была фактически вставлена.

Смежные вопросы