ПРИМЕЧАНИЕ. Это решение только для MySQL, поскольку MySQL имеет собственную интерпретацию GROUP BY
.
Я также использовал свой собственный расчет сходства. Я взял количество идентичных тегов и разделил его на среднее количество тегов в посте A и посте B. Поэтому, если пост A имеет 4 тега, а пост B имеет 2 тега, которые оба совместно используются с A, сходство составляет 66%. .
(SHARED:2 / ((A:4 + B:2)/2)
или (SHARED:2) / (AVG:3)
Должно быть легко изменить формулу, если вы хотите / должны ...
SELECT
sourcePost.id,
targetPost.id,
/* COUNT NUMBER OF IDENTICAL TAGS */
/* REF GROUPING OF sourcePost.id and targetPost.id BELOW */
COUNT(targetPost.id) /
(
(
/* TOTAL TAGS IN SOURCE POST */
(SELECT COUNT(*) FROM post_tags WHERE post_id = sourcePost.id)
+
/* TOTAL TAGS IN TARGET POST */
(SELECT COUNT(*) FROM post_tags WHERE post_id = targetPost.id)
) / 2 /* AVERAGE TAGS IN SOURCE + TARGET */
) as similarity
FROM
posts sourcePost
LEFT JOIN
post_tags sourcePostTags ON (sourcePost.id = sourcePostTags.post_id)
INNER JOIN
post_tags targetPostTags ON (sourcePostTags.tag_id = targetPostTags.tag_id
AND
sourcePostTags.post_id != targetPostTags.post_id)
LEFT JOIN
posts targetPost ON (targetPostTags.post_id = targetPost.id)
GROUP BY
sourcePost.id, targetPost.id