改进MySQL相关文章查询

时间:2013-12-26 10:23:09

标签: mysql

对于相关主题列表,我使用标签查询。它显示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)

2 个答案:

答案 0 :(得分:1)

首先,请原谅我将表名更改为messagemessage_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