Я получаю список результатов, возвращенных из моего запроса, который я хочу заказать в наилучшем совпадении. Я постараюсь быть настолько ясным, насколько могу, но если что-то недостаточно ясно, дайте мне знать, и я постараюсь сделать это более ясным.
Пользователь уже вошел в список настроек, называемых findsettings
. С этими findsettings
я ищу продукты. Это все идет хорошо, пока он не выйдет на лучший матч.
Существует несколько полей, таких как min_review, max_price, allows_pets, etc
. Д.
Я хочу заказать. Например, он должен сначала заказать продукты с min_review of 40%
, затем max_price = 10.00
а затем allows_pets = 0
. Вы можете сделать это с помощью OR
, но я хочу, чтобы результаты, которые не соответствуют типу, также отображались только в нижней части списка. Таким образом, в основном он должен показать лучший матч первым, а затем вторым, третьим и т. Д., До тех пор, пока продукты не будут соответствовать наименее.
Я не уверен, как справиться с этим, поэтому я надеюсь, что вы поможете мне разобраться в этом.
Основной принцип – создать оценку релевантности для каждой записи, а затем отсортировать ее.
Если вы хотите, чтобы каждый критерий имел одинаковый вес, в MySQL вы можете просто добавить каждое логическое выражение вместе (обратите внимание, что это нестандартная SQL-в других СУБД, вам, возможно, придется использовать CASE
для проверки условия и получения числа):
ORDER BY (review>=40/100) + (price<=10.00) + (allows_pets=0) DESC
Если критерии неравно взвешены, вы можете умножить каждое выражение на его вес:
ORDER BY 5*(review>=40/100) + 3*(price<=10.00) + 1*(allows_pets=0) DESC
И / или если те, которые соответствуют определенному подмножеству, должны всегда отображаться первыми, независимо от более поздних результатов, вы можете разделить предложение ORDER BY
:
ORDER BY 5*(review>=40/100) + 3*(price<=10.00) DESC, 1*(allows_pets=0) DESC
Если вы хотите увидеть оценку релевантности в своих результатах, вы можете также добавить любое из приведенных выше выражений в ваш SELECT
(а затем использовать полученный столбец в предложении ORDER BY
, чтобы избежать его записи дважды):
SELECT *, (review>=40/100) + (price<=10.00) + (allows_pets=0) AS relevance, FROM my_table ORDER BY relevance DESC
Обратите внимание, что если вы хотите получить записи, которые имеют значение, min_review
близкое к некоторой цели (например, min_review
близкое к 40%, а не точное), вы можете взять (абсолютную?) Разницу между ним и вашим целевым значением:
IF(review>=40/100, review-40/100, NULL)
Однако вы должны быть осторожны, чтобы правильно взвешивать свои выражения, если / при объединении с другими в одном критерии.