воскресенье, 13 сентября 2009 г.

Выборка релевантных тегов (ярлыков)

Суть проблемы — на нескольких сайтах можно видеть фильтрацию новостей по нескольким тегам: если выбрать один тег — будут показаны новости которые имеют этот тег, а отображаемый список тегов будет уменьшен так, чтобы остались только те теги, которые встречаются в отфильтрованных по первому тегу новостях. И так далее, пока не закончатся теги в результате их «фильтрации». Тоесть, чтобы при выборе нескольких тегов остались только те новости, которые содержат полный их набор.
Хороший пример этому Delicious принадлежащий компании Yahoo!

Как это сделать на ?
Опишу только алгоритм.
Имеются 3 таблицы posts(id,content), tags(id,tag), posts_tags(id,post_id,tag_id).
как Вы поняли, третья таблица соединяет первые две.
1. сначала выбираю статью, со всеми тегами.
2. выбираю остальные статьи с этими же тегами.
3. выбираю список тегов в этих статьях.
4. сортирую этот список тегов, удаляю одинаковые (например через array_unique())

Если Вы хотите хранить теги через запятую, а потом искать их через "tags LIKE '%тег%'", то спешу Вас огорчить. Этот способ плохой до не узнаваемости. Все дело в том, что даже если на поле tags вы повесили index, то при использовании "tags LIKE '%тег%'" этот индекс учтен не будет.

Взято из обсуждения с одного сообщества, а так как это ответ мой, то я смело публикую это здесь.