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