2012-02-14 106 views
2

我想在表格中插入新的价格范围,但在我需要检查我的价格范围是否已包含或者是任何其他价格范围的一部分之前。如何检查是否一个价格范围,包括在任何价格范围内使用MySQL?

下面是一个例子:

我的价格区间表:

| minimum | maximum | 
--------------------- 
|  1 |  100 | 
|  201 |  300 | 
|  301 |  400 | 
  • 如果我提交[50200],我一定要,因为50是包含在范围[1100]拒绝它。
  • 如果我提交[175,201],我必须拒绝它,因为201包含在[201,300]范围内。
  • 如果我提交[350,380],我必须拒绝它,因为350和380包含在[301,400]范围内。
  • 如果我提交[120,190],我必须接受它是因为120和190不包含在任何范围内。

我的问题是如何检查MySQL是否提交的范围是否包括在我的表中。

回答

1

这应该工作(假设表称为ranges和新的范围参数和@low分别@high):

IF(NOT EXISTS (SELECT * 
       FROM ranges 
       WHERE @low BETWEEN minimum AND maximum) 
    AND 
    NOT EXISTS (SELECT * 
       FROM ranges 
       WHERE @high BETWEEN minimum AND maximum)) 
BEGIN 
    INSERT INTO ranges 
     (minumum, maximum) 
     VALUES 
     (@low, @high) 
END 

当然,这可能是进一步聚结/冷凝:

IF(NOT EXISTS (SELECT * 
       FROM ranges 
       WHERE @low BETWEEN minimum AND maximum 
        OR @high BETWEEN minimum AND maximum)) 
BEGIN 
    INSERT INTO ranges 
     (minumum, maximum) 
     VALUES 
     (@low, @high) 
END 

,并进一步:

INSERT INTO ranges 
    (minimum, maximum) 
SELECT T.minimum, T.maximum 
    FROM (SELECT @low as minimum, @high as maximum) T 
WHERE NOT EXISTS (SELECT * 
        FROM ranges 
        WHERE @low BETWEEN minimum AND maximum 
         OR @high BETWEEN minimum AND maximum) 
0

假设您要测试的新值是rangestart, rangeend,请选择一行的开始或结束位置在minimum AND maximum之间。任何结果行都会指示范围重叠并且无法添加。如果该查询返回任何行,范围不会重叠,是有效的。

SELECT 
    TRUE 
FROM ranges 
WHERE 
    rangestart BETWEEN minimum AND maximum 
    OR rangeend BETWEEN minimum AND maximum 
0

试试这个:

SELECT 'True' as Result 
    FROM PriceRange 
WHERE iStartValue BETWEEN minimum AND maximum OR 
     iEndValue BETWEEN minimum AND maximum 
1
INSERT INTO priceranges 
    SELECT * FROM 
    (SELECT <newminprice>, <newmaxprice>) AS baseview 
    WHERE NOT EXISTS (
    SELECT * FROM ranges 
    WHERE <newminprice> BETWEEN minimum AND maximum 
     OR <newmaxprice> BETWEEN minimum AND maximum 
) 

应该这样做在一个查询

+0

工作非常适合我 – 2016-03-03 07:10:25