@VadimZaz

Необходима помощь в sql запросе?

Необходимо создать фильтр в таблице по трем столбцам: обьем, высота, диаметр.
Необходимо выводить в таблице результаты максимально приближенные к значениям введенным в поля фильтра
к примеру вводим в поле обьема 5 и должно вывести обьекты с максимально близкими значениями из бд.
Если в бд есть обьемы 1, 2, 3, 5, 8, 10, 12 , то должно вывести обьекты с обьемом 3, 5, 8.

Нужна помощь хотя бы с чего начать и в каком направлении копать и возможно ли вообще такое,
буду благодарен ссылкам.
  • Вопрос задан
  • 839 просмотров
Пригласить эксперта
Ответы на вопрос 3
wildvampir
@wildvampir
Маньяк программист, в худшем его проявлении.
Вам нужно отсортировать товары по наименьшей разнице между значением в таблице и введёнными данными
ORDER BY (ABS(volume - %введёный объём%)) ASC
ABS используется для получения абсолютного значения иначе могут быть не корректные результаты, для нескольких условий вам понадобится сложить все разницы
ORDER BY (ABS(volume - %введёный объём%) + ABS(height - %введёная высота%)) ASC`

и отсечь нужное количество используя LIMIT например
LIMIT 3
в итоге у вас должно получиться что-то подобное
SELECT * FROM articles ORDER BY (ABS(volume - 5)) ASC LIMIT 3

или (для нескольких параметров)
SELECT * FROM articles ORDER BY (ABS(volume - 5) + ABS(height - 8)) ASC LIMIT 3
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
По одному столбцу фильтруется без проблем:
SELECT *
  FROM `table`
  WHERE `field` = :value
UNION (
  SELECT *
    FROM `table`
    WHERE `field` > :value
    ORDER BY `field` DESC
    LIMIT 1)
UNION (
  SELECT *
    FROM `table`
    WHERE `field` < :value
    ORDER BY `field`
    LIMIT 1)

По нескольким столбцам такая фильтрация, в общем случае, не получится.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
одно из простых решений:
задаем диапазоны допустимых значений для фильтров
отбираем строки в рамках этих диапазонов
сортируем их либо по абсолютному отклонению от значений фильтров, либо по некоей "формуле" совокупного отклонения (например корень квадратный из суммы квадратов отклонений)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы