Я получаю список результатов, возвращенных из моего запроса, который я хочу заказать в наилучшем совпадении. Я постараюсь быть настолько ясным, насколько могу, но если что-то недостаточно ясно, дайте мне знать, и я постараюсь сделать это более ясным.
Пользователь уже вошел в список настроек, называемых 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)
Однако вы должны быть осторожны, чтобы правильно взвешивать свои выражения, если / при объединении с другими в одном критерии.