Я пытаюсь выяснить наиболее эффективный способ генерации запроса WHERE. Я задал еще один вопрос раньше, который был похож, но я точно пойду по этому вопросу.Распространение диапазонов номеров
Учитывая набор диапазонов чисел, то есть 1-1000
, 1500-1600
, довольно просто создать mysql, где условие для выбора записей, которые находятся между этими значениями.
т.е. вы бы просто сделать:
WHERE (lft BETWEEN 1 and 1000) OR (lft BETWEEN 1500-1600)
. Однако, если вы хотите включить НЕ МЕЖДУ.
Например, если определить несколько правил, как ...
- ПОЗВОЛЯЮТ МЕЖДУ 1 - 1000
- ПОЗВОЛЯЮТ МЕЖДУ 1500 - 1600
- ПОЗВОЛЯЮТ МЕЖДУ 1250 - 1300
- ОТРИЦАТЬ МЕЖДУ 25 - 50
Как слить эти правила, чтобы эффективно генерировать условие WHERE. Мне хотелось бы, чтобы ГДЕ нужно было вскрыть ALLOW BETWEEN 1 - 1000
, чтобы создать пробел в нем. Чтобы это стало 1-24
и 51-1000
. Поскольку правило DENY определено после первого правила, оно «перезаписывает» предыдущие правила.
В качестве другого примера, Скажите, что у вас есть
- ПОЗВОЛЯЮТ МЕЖДУ 5 - 15
- ОТРИЦАТЬ МЕЖДУ 10 - 50
- ПОЗВОЛЯЮТ МЕЖДУ 45 - 60
Тогда я хотел бы для создания условия ГДЕ, которое позволило бы мне:
WHERE (lft BETWEEN 5 and 9) OR (lft BETWEEN 45 and 60)
.
Notes (редактирование)
- Кроме того, максимальный диапазон, который когда-либо разрешено 1 - 5600000. (который будет 'Земля'), то есть. Разрешить все на Земле.
- Диапазоны чисел на самом деле являются значениями LEFT в модели NESTED SET. Это не уникальные ключи. Вы можете прочитать, почему я хочу сделать это в этом вопросе, который я задал ранее. https://stackoverflow.com/questions/6020553/generating-a-mysql-between-where-condition-based-on-an-access-ruleset
- Возможное важное замечание на мой номер в диапазоне я, возможно, не следовало бы использовать образец пример, который я сделал, но один важное замечание о природе числа диапазонов является то, что диапазоны должны фактически всегда полностью потреблять или потребляется по предыдущему правилу. Например, я использовал пример выше, 10-50 разрешить и отклонить 45-60. На самом деле это никогда не произойдет в моем наборе данных. На самом деле это будет
allow 10-50
, тогда DENY придется либо полностью поглотить этот диапазон, т. Е. 34-38. ИЛИ, полностью потребляют предыдущее правило.9-51
. Это потому, что диапазоны на самом деле представляют значения lft и rgt во вложенной модели модели, и вы не можете иметь перекрытия, как я представил.
Я не думал упоминать это, задавая вопрос, но, увидев рабочий пример кода ниже, я вижу, что эта заметка на самом деле важна.
(Отредактированный пример MySQL, чтобы включить или вместо AND, как в комментарии ниже)
Это логически невозможно, так как число не может быть в пределах от 5 до 9, а также между 45 и 60. Возможно, вы имели в виду " ИЛИ'? –
Извините. Да, ты прав.Это логически невозможно. Я не знаю, о чем хочу думать. Я намеревался сказать ИЛИ. – Layke