对于相关主题列表,我使用标签查询。它显示5个文章的列表,这些文章共有1个或多个标签,并且比查看的标签旧。
是否有可能通过赋予具有2,3,4 ...标签共同的文章更多权重来编写产生更多相关结果的查询?
我在或多或少相同的主题上看到了这个主题: MySQL Find Related Articles
但是在共同少于3个标签的情况下产生0结果。
我现在使用的查询:
SELECT DISTINCT
AAmessage.message_id, AAmessage.title, AAmessage.date
FROM
AAmessage
LEFT JOIN
AAmessagetagtable
AS child ON child.message_id = AAmessage.message_id
JOIN AAmessagetagtagtable
AS parent ON parent.tag_id = child.tag_id
AND
parent.message_id = '$message_id'
AND AAmessage.date < '$row[date]'
ORDER BY
AAmessage.date DESC LIMIT 0,5
使用表格:
AAmessage (message_id, title, date...)
AAmessagetable (key, message_id, tag_id)
AAtag (tag_id, tag.... not used in this query but needed to store names of tags)
答案 0 :(得分:1)
首先,请原谅我将表名更改为message
和message_tag
以提高可读性。
其次,我没有测试过这个。使用它作为指针而不是确定的答案。
查询使用两个子查询,可能效率不高,可能还有改进的余地。首先,最里面的查询查找当前消息的标记。然后,中间查询查找标记有至少一个公共标记的消息。分组用于获取唯一的message_id,并按公共标记的数量对它们进行排序。最后,JOIN
用于加载其他详细信息并过滤掉旧邮件。
您可能会注意到我使用的是问号,而不是'$xyz'
。这是为了避免关注转义变量内容。
SELECT message_id, title, date
FROM message
RIGHT JOIN (SELECT message_id, COUNT(*)
FROM message_tag
WHERE tag_id IN
(SELECT MT.tag_id FROM message_tag MT WHERE MT.message_id = ?)
GROUP BY message_id
ORDER BY COUNT(*) DESC) RELATED_MESSAGES
ON message.message_id = RELATED_MESSAGES.message_id
WHERE date < ?
答案 1 :(得分:0)
我在这种情况下使用HAVING。
SELECT DISTINCT m.message_id, m.title, m.date
FROM AAmessage AS `m`
LEFT JOIN AAmessagetagtable AS `mt` ON mt.message_id = mt.message_id
GROUP m.message_id
HAVING COUNT(mt.key) >= 1
WHERE m.message_id = '$message_id'
AND m.date < '$row[date]'
ORDER BY m.date DESC
LIMIT 5