Закажите SQL-запрос в наилучшем совпадении

Я получаю список результатов, возвращенных из моего запроса, который я хочу заказать в наилучшем совпадении. Я постараюсь быть настолько ясным, насколько могу, но если что-то недостаточно ясно, дайте мне знать, и я постараюсь сделать это более ясным.

Пользователь уже вошел в список настроек, называемых findsettings . С этими findsettings я ищу продукты. Это все идет хорошо, пока он не выйдет на лучший матч.

Существует несколько полей, таких как min_review, max_price, allows_pets, etc . Д.

Я хочу заказать. Например, он должен сначала заказать продукты с min_review of 40% , затем max_price = 10.00 а затем allows_pets = 0 . Вы можете сделать это с помощью OR , но я хочу, чтобы результаты, которые не соответствуют типу, также отображались только в нижней части списка. Таким образом, в основном он должен показать лучший матч первым, а затем вторым, третьим и т. Д., До тех пор, пока продукты не будут соответствовать наименее.

Я не уверен, как справиться с этим, поэтому я надеюсь, что вы поможете мне разобраться в этом.

Solutions Collecting From Web of "Закажите SQL-запрос в наилучшем совпадении"

Основной принцип – создать оценку релевантности для каждой записи, а затем отсортировать ее.

Если вы хотите, чтобы каждый критерий имел одинаковый вес, в 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) 

Однако вы должны быть осторожны, чтобы правильно взвешивать свои выражения, если / при объединении с другими в одном критерии.