Как проверить, включен ли ценовой диапазон в любой ценовой диапазон с MySQL? - PullRequest
2 голосов
/ 14 февраля 2012

Я хотел бы вставить новый ценовой диапазон в таблицу, но перед тем, как мне нужно проверить, включен ли мой ценовой диапазон или входит в какой-либо другой ценовой диапазон.

Вот пример:

Моя таблица ценовых категорий:

| minimum | maximum |
---------------------
|       1 |     100 |
|     201 |     300 |
|     301 |     400 |
  • Если я отправлю [50,200], я должен отклонить его, потому что 50 входит в диапазон [1100].
  • Если я отправлю [175,201], я должен отклонить его, потому что 201 входит в диапазон [201,300].
  • Если я отправлю [350,380], я должен отклонить его, потому что 350 и 380 включены в диапазон [301,400].
  • Если я отправлю [120,190], я должен принять , потому что 120 и 190 не включены ни в один диапазон.

Мой вопрос состоит в том, как проверить с MySQL, включен ли представленный диапазон в мою таблицу или нет.

Ответы [ 4 ]

1 голос
/ 14 февраля 2012
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
  )

должен сделать это в одном запросе

1 голос
/ 14 февраля 2012

Это должно работать (при условии, что таблица называется 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 голосов
/ 14 февраля 2012

попробуйте это:

SELECT 'True' as Result
  FROM PriceRange
 WHERE iStartValue BETWEEN minimum AND maximum OR
       iEndValue   BETWEEN minimum AND maximum
0 голосов
/ 14 февраля 2012

Предполагая, что ваши новые значения для тестирования rangestart, rangeend, выберите строку с началом или концом в диапазоне minimum AND maximum.Любая результирующая строка будет указывать, что диапазон перекрывается и не может быть добавлен.Если этот запрос не возвращает строк, диапазон не перекрывается и является действительным.

SELECT 
  TRUE
FROM ranges
WHERE
   rangestart BETWEEN minimum AND maximum
   OR rangeend BETWEEN minimum AND maximum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...