Альтернативный метод, который я только что реализовал для решения этой проблемы, заключается в использовании побитовых операторов для ускорения процесса.В 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