Поиск совпадающих тегов (поиск сходства) с MySQL и ограничениями - PullRequest
0 голосов
/ 01 июня 2018

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

Моя проблема: На веб-сайте есть помеченные элементы.На подробном представлении элемента, например, http://localhost/items/a.html я хочу показать список похожих / связанных элементов на основе их тегов.

  • Элемент A-Tags

    • Труд
    • Химия
    • Аналитик
    • Mehrweg
  • Элемент B-Метки

    • Труда
    • Химия
    • количественный
    • Лактозе
  • Пункт C-Метки

    • количественный
    • abscheiden
    • Flaschenpfand

Структура таблиц: (как в здесь )

Таблица: статья Поля: articleid, заголовок

Таблица: тег Поля: tagid, tagtext

Таблица: articletag Поля: tagid, articleid

Когда я сейчас посещаю следующую точку входа (http://localhost/items/b.html) для элемента B, я хочу напечатать список для пользователя, который показывает связанные элементы в следующем порядке:

  • Элемент A (из-за двух одинаковых меток)
  • Элемент C (из-за одной одинаковой метки)

Когда я искал в Google, я нашел что-то вроде этого: Как сравнить два списка строк, разделенных запятыми, используя MySQL

Это выглядит так же, как моя проблема, но я не сделалНе вижу никаких подсказок, как решить это для моего запроса.Большинство других постов, которые я обнаружил, просто исключают элементы a и c, потому что они не соответствуют всем тегам (элемент a не соответствует тегам qantitativ и Laktose)

Какая дополнительная информация вам нужна?Кстати, я не буду добавлять все теги в качестве дополнительного свойства в таблицу элементов, чтобы можно было сопоставить этот столбец.Я просто не хочу обновлять эти теги всегда, когда они меняются.Это просто удваивает размер сохраняемых данных в БД.

1 Ответ

0 голосов
/ 05 июня 2018
SELECT  c.articleid, COUNT(*) AS ct
    FROM articletag AS b
    JOIN articletag AS c  ON c.tagid = b.tagid
                         AND c.articleid != b.articleid
    WHERE b.articleid = 123
    GROUP BY c.articleid
    ORDER BY ct DESC;

При поиске того, что «похоже» на 123 (Item-B в вашем примере), вывод должен

Item-A, 2
Item-C, 1

Это полное сканирование articletag.Итак, прислушайтесь к советам в моем обсуждении many: many mapping .

Если вам нужно получить информацию о статьях после выполнения запроса, используйте ее какпроизводная таблица;например:

SELECT articles.*
    FROM ( the above SELECT ) AS x
    JOIN articles USING(articleid)
    ORDER BY x.ct DESC;

(Вы можете удалить ORDER BY из внутреннего запроса, поскольку он будет игнорироваться в предпочтении перед внешним ORDER BY.)

...