SQL-запрос для поиска лучших категорий соответствия - PullRequest
0 голосов
/ 06 декабря 2011

У меня есть категории и несколько категорий для моих товаров. Как найти, для конкретного Предмета, другие Предметы, которые имеют те же категории, упорядоченные по большинству совпадающих категорий (или лучшее совпадение)?

Моя структура таблицы примерно:

Таблица параметров

ID
Name
...

Таблица категорий

ID
Name
...

Таблица классификации

ID
Item_ID
Category_ID
...

Чтобы найти все предметы, имеющие похожие категории, например, я использую

SELECT `items`.* 
FROM `items` 
INNER JOIN `categorizations` c1
ON c1.`item_id` = `items`.`id`
INNER JOIN `categorizations` c2
ON c2.`item_id` = <Item_ID>
WHERE `c1.`category_id` = c2.`category_id`

Ответы [ 3 ]

1 голос
/ 06 декабря 2011

Это должно привести к таблице подсчета совпадений категорий между каждой парой предметов, которые разделяют хотя бы одну категорию.

select i1.item_id,i2.item_id,count(1)
from items i1
join categorizations c1 on c1.item_id=i1.item_id
join categorizations c2 on c2.category_id=c1.category_id
join items i2 on c2.item_id=i2.item_id
where i1.item_id <> i2.item_id
group by i1.item_id,i2.item_id
order by count(1)

Я подозреваю, что это может быть немного медленно, хотя. В данный момент у меня нет экземпляра MySQL, чтобы попробовать его.

0 голосов
/ 24 июля 2013

Альтернативный метод, который я только что реализовал для решения этой проблемы, заключается в использовании побитовых операторов для ускорения процесса.В MySQL этот метод работает только в том случае, если у вас 64 или менее категорий, поскольку битовые функции являются 64-битными.

1) Присвойте каждой категории уникальное целочисленное значение, равное 2.

2) Для каждого элемента суммируйте значения категорий, в которых находится элемент, чтобы создать 64-битное целое число, представляющее все категории, в которых находится элемент.

3) Чтобы сравнить элемент с другим, выполните что-то вроде:

SELECT id, BIT_COUNT(item1categories & item2categories) AS numMatchedCats FROM tablename HAVING numMatchedCats > 0 ORDER BY numMatchedCats DESC

Функция BIT_COUNT () может быть специфичной для MySQL, поэтому вполне может потребоваться альтернатива для любой другой БД.

Здесь описываются используемые битовые функции MySQL: http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html

0 голосов
/ 06 декабря 2011

Что-то вроде:

select item_id, count(id)
from item_category ic
where exists( 
 select category_id 
 from item_category ic2 
 where ic2.item_id = @item_id 
 and ic2.category_id = ic.category_id ) 
where item_id <> @item_id
group by item_id
order by count(item_id) desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...