SQL выберите, если число находится между интервалом

Я занят созданием сайта-каталога для моего клиента, и мне нужно немного настроить поиск.

Каталог содержит целую кучу товаров. Каждый продукт может содержать один, несколько и интервал номеров позиций. Чтобы немного пояснить это, я привел несколько примеров ниже.

ПРИМЕР 1) несколько номеров элементов

номер элемента = 100, 105, 109, 200

ПРИМЕР 2) интервал номеров элементов

номер элемента = 100 - 110

ПРИМЕР 3) Комбинация

номер элемента = 100 - 110, 220, 300 - 310, 400, 401

Поэтому у меня вопрос:

есть ли синтаксис, который позволяет мне проверять интервалы между двумя числами, разделенными «-»?

Если да, любые предложения о том, как составить запрос, который позволит мне реализовать.

Если нет, какие направления вы могли бы порекомендовать?


Дополнительная информация

Сайт создан на WordPress, где номер элемента — это настраиваемое метаполе. Я подключился к банкомату pre_posts и добавил: - также вставил в pastebin для удобства чтения pastebin

$where .= " OR ID IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_value LIKE '%" . $wp_query->query_vars['s'] . "%' AND ( {$wpdb->posts}.ID=post_id AND {$wpdb->posts}.post_status!='inherit' AND ( {$wpdb->posts}.post_type='produkt' ) ) )";

Приведенный выше код просто проверяет, а не содержит ли метаполя продуктов искомое слово, недостаточно конкретное.



person Stefan Hans Schonert    schedule 13.06.2013    source источник
comment
Что значит проверять интервалы между двумя числами, разделенными «-»? Не могли бы вы добавить ввод и ожидаемый результат?   -  person Boris Pavlović    schedule 13.06.2013
comment
Борис, пример 2 -> где числа разделены '-'. Ввод может быть 1 - 4, а вывод будет sql-проверкой, соответствует ли искомая строка 1 2 3 или 4   -  person Stefan Hans Schonert    schedule 13.06.2013


Ответы (3)


Невозможно использовать реляционную логику в преднамеренно денормализованной базе данных, такой как злой подход «настраиваемое метаполе Wordpress».

Итак, лучшее, что вы можете сделать, это выполнить 2 запроса:

  • Один, чтобы получить все числа
  • затем расширьте все интервалы в PHP (с помощью array_fill(), range() или чего-то еще), чтобы создать обычный список, разделенный запятыми
  • последний передан второму запросу в IN()

В качестве преимущества вы получите гораздо более быстрое выполнение

person Your Common Sense    schedule 13.06.2013
comment
Я рассматривал это, но у меня сложилось впечатление, что получение всего продукта + мета (примерно 100+ продуктов, каждый с тонной мета), а затем обработка в PHP замедлит выполнение по сравнению с простым сопоставлением его через SQL (?) - person Stefan Hans Schonert; 13.06.2013
comment
Сопоставление через SQL отсутствует, так как вы вообще не используете SQL в своей схеме, а используете хранилище ключей-значений. Таким образом, вы должны следовать тому же подходу «ключ-значение», который вы выбрали. Ведь нельзя сидеть на двух стульях сразу. - person Your Common Sense; 13.06.2013

Замените «-» на «И» и используйте ключевое слово BETWEEN, чтобы получить записи:

Где Column_Name находится между 100 и 110

person Transformer    schedule 13.06.2013

Вы должны создать свою собственную функцию, которая будет строить запрос, используя CREATE FUNCTION / CREATE PROCEDURE.

Создать документы процедуры:

http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

Документация по строковым функциям:

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

person sonique    schedule 13.06.2013