Intereting Posts
Есть ли синтаксический анализатор PHP для Notepad ++? html-объекты не конвертируют специальные символы Запретить пользователям открывать несколько экземпляров одного и того же веб-сайта Оптимизирует ли PHP рекурсию хвоста? Как создать общий шаблон с верхним и нижним колонтитулом для проектов phalcon с помощью Volt Engine Symfony 1.4 с использованием устаревших функций в php 5.5 Как повторить транзакцию после тупика с помощью Doctrine? Флажок не отправляется в POST с помощью PHP Один элемент викторины на страницу (программа тестирования php / mysql) Как преобразовать строку с датой и временем AM / PM в 24-часовой формат timestamp mysql PHP shell_exec () не выполнит команду экрана для запуска .jar-файла PHP Предупреждение: запуск PHP: невозможно загрузить динамическую библиотеку Доступ к значениям массива можно получить с помощью переменных переменных? CodeIgniter 3.x – Перезагрузка просмотра с помощью другого CSS-файла с использованием пользовательского ввода Переписать запрос в подкаталог

Сортировка элементов совпадающих тегов, имеющих вес в MySQL

Мне сложно найти правильные запросы / запросы здесь. Когда вы хотите найти связанные элементы с помощью тегов, в MySQL вы можете использовать «общий счетчик тегов», чтобы найти наиболее похожие элементы.

Скажем, моя схема выглядит так:

  • теги (tag_id, название)
  • статьи (article_id, some_text)
  • articles_tags (tag_id, article_id)

Затем вы можете получать предметы и сортировать их по общим тегам с помощью «статьи 2», например:

SELECT at1.article_id, Count(at1.tag_id) AS common_tag_count FROM articles_tags AS at1 INNER JOIN articles_tags AS at2 ON at1.tag_id = at2.tag_id WHERE at2.article_id = 2 GROUP BY at1.article_id HAVING at1.article_id != 2 ORDER BY common_tag_count DESC; 

Но в моей ситуации есть проблема. Я хочу найти похожие статьи, основанные на нескольких статьях, а не на одном (что-то вроде «истории чтения»). И если в двух статьях есть тег X, я хочу, чтобы тег X стал более важным.

Итак, я ищу способ сделать совпадение common_tag_count, но с весом для тегов. Кто-нибудь знает, как это сделать?

Чтобы получить теги, используемые несколькими статьями, в том числе, как часто они используются, вы можете использовать этот запрос:

 SELECT tag_id, COUNT(article_id) as tag_weight FROM articles_tags WHERE article_id IN ( /* Read articles */ 1, 2 ) GROUP BY tag_id; 

Чтобы получить похожие статьи, основанные на этом выборе, вы должны использовать вышеуказанный запрос в аналогичном объединении, как у вас уже есть:

 SELECT articles.article_id, articles.title, SUM(tag_weights.tag_weight) FROM articles JOIN articles_tags ON articles_tags.article_id = articles.article_id JOIN ( SELECT tag_id, COUNT(article_id) as tag_weight FROM articles_tags WHERE article_id IN ( /* Read articles */ 1, 2 ) GROUP BY tag_id ) AS tag_weights ON articles_tags.tag_id = tag_weights.tag_id WHERE articles.article_id NOT IN ( /* Read articles */ 1, 2 ) GROUP BY articles.article_id ORDER BY SUM(tag_weights.tag_weight) DESC; 

Мы добавляем дополнительный JOIN здесь, в подзапрос, который имеет доступ к весам тегов. Используя ORDER BY вы сначала получаете «лучшие» результаты.

Демо: http://www.sqlfiddle.com/#!2/b35432/2/1 (статьи 1 и 2 читаются, давая тегу 1 вес 2, тег 2 – вес 1).