tomasoyer
@tomasoyer
web разработчик

Как сделать выборку по максимальному совпадению полей?

Есть задумка выводить в блок похожих, товары по принципу наибольшего совпадения по характеристикам.

С точки зрения mysql имеются 2 таблицы, в первой лежат "товары" во второй характеристики в виде

id, id_tovar, name, value

Где:
id - уникальный id записи
id_tovar - id записи из таблицы товара
name - Наименование характеристики (например длинна, цвет и т.п.)
value - значение характеристики (например 1метр, красный и т.п.)

Характеристик у товара может быть произвольное количество. В среднем от 5 до 15. По сути требуется отсортировать товары по максимальному совпадению харрактеристик. Сначала идут с полным совпадением, потом совпадающие по -1 свойству и так далее.

На просторах интернета был обнаружен совет:

Вам помогут CROS JOIN и функция IF(). Суть такова: вы получаете декартово произведение двух таблиц, для каждой строки вычисляете количество совпадающих полей и сортируете по количеству совпадений.

select p2.id,
       if(p1.width = p2.width, 1, 0) +
       if(p1.height = p2.height, 1, 0) +
       if(p1.color = p2.color, 1, 0) +
       if(p1.education = p2.education, 1, 0) as matching_fields
from profile1 p1
cross join profile2 p2
where p1.id = 6
order by matching_fields desc;

sqlfiddle.com/#!2/417c25c/9


Подскажите, где посмотреть реализации подобного или почитать теорию по решению этой задачи.
  • Вопрос задан
  • 474 просмотра
Пригласить эксперта
Ответы на вопрос 2
@IceJOKER
Web/Android developer
А что вам нужно посмотреть-то? В запросе принцип работы показан же, если есть совпадение, то увеличиваем вес на 1 иначе на 0 и в конечном счете сортируем по сумме веса.

Если хотите про JOIN-ы прочесть, то - potapov.com.ua/library/21 , или еще лучше:
e60fdec2379da78d91098f3f39e7f67d.jpg
Ответ написан
Комментировать
myfirepukan
@myfirepukan
Жарим поиск
В таких вещах я бы сначала подумал что я экономлю - место, запросы или процессор.
Возможно идея плохая, но я бы заранее считал похожесть параметров в процентах например (или каком-то другом обобщённом показателе) и хранил бы это значение в отдельном поле.

Ещё я бы заранее определил что такое похожие товары - какие критерии похожести? (цвет, например, на мой взгляд в этом параметре не должен участвовать). Можно отдать выбор посетителю типа: найти похожие телевизоры по размеру или найти похожие по функционалу.

Можно запрашивать все параметры товара и если 80% параметров или больше одинаковы - товары похожи.
Если параметры числовые, можно для телевизора с диагональю 100 см. искать в базе телевизоры с диагональю от 95 до 105 см, т.е. +- 10%

Есть ещё такая идея: каждому товару заранее присвоить похожие и при выводе на экран просто выводить из этого поля. Похожие товары пересчитывать один раз при добавлении, обновлении ассортимента или раз в неделю по крону. В этом случае хорошо то что системных ресурсов и запросов на такой скрипт можно не жалеть.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы