MySQL:如何按标签排序(标签数量,然后是标签优先级)
给出三个表(文章、文章标签、标签) 通常,“按标签列出的相关文章”是根据它们匹配的原始文章标签数量进行排名的。因此,如果原始文章具有TagA、TagB和TagC标记,那么也具有所有三个标记的任何相关文章都将首先显示,并根据匹配的标记数量向下延伸,在该数据点之后没有顺序 我想做的是增加在典型行为之后发生的行为 如果原始文章的TagA优先级为1,TagB优先级为2,TagC优先级为3,则顺序仍应倾向于更多匹配的标记,但随后应采用上述优先级:共享TagA(优先级为1)的文章应首先出现;接下来是分享TagB的文章;分享TagC的文章应该排在最后MySQL:如何按标签排序(标签数量,然后是标签优先级),mysql,Mysql,给出三个表(文章、文章标签、标签) 通常,“按标签列出的相关文章”是根据它们匹配的原始文章标签数量进行排名的。因此,如果原始文章具有TagA、TagB和TagC标记,那么也具有所有三个标记的任何相关文章都将首先显示,并根据匹配的标记数量向下延伸,在该数据点之后没有顺序 我想做的是增加在典型行为之后发生的行为 如果原始文章的TagA优先级为1,TagB优先级为2,TagC优先级为3,则顺序仍应倾向于更多匹配的标记,但随后应采用上述优先级:共享TagA(优先级为1)的文章应首先出现;接下来是分享Ta
SELECT a.*
FROM articles a
JOIN (
SELECT articleID, SUM(at.priority) total_priority
FROM articleTags at
JOIN tags t ON at.tagid = t.tagID
WHERE t.tagName IN ('TagA','TagB','TagC')
GROUP BY articleID
) q ON a.articleID = q.articleID
ORDER BY q.total_priority
这是我到目前为止设置的,但它似乎没有给我需要的结果
更新:
让我们举个例子,假设我们有四篇文章:
- 第A条(标记为TagA、TagB、TagC)
- 第B条(标记为TagB、TagC)
- 第C条(标记为TagC)
- D条(标记为TagC、TagB、TagA)
- 第E条(标记为TagC、TagA)
希望这能有所帮助。
按q.total\u优先级排序,t.tagName
或者如果您想根据名称控制它。。。当t.tagName='TagA'时,使用条件顺序by分配所需的优先级case;当t.tagName='TagB'时分配1;当t.tagName='TagC'时分配2;当t.tagName='TagC'时分配3;否则4 end
如果优先级与标记表一起存储,则可以避免硬编码。但我肯定我不理解这里的全部问题。每篇文章的优先级会有所不同。一篇文章可能更多地是关于TagB而不是关于TagA的,因此TagB将排名第一,而TagA将排名第二,因此在articleTags表中存储。这有帮助吗?听起来很有趣;但我只是不明白:有了模拟的数据和预期的结果,我可能会达到目的。我已经更新了问题,加入了一个例子。好吧,我差不多到了。。。所以输入的顺序很重要,因为D条和A条一样都有标签B和A。我本以为顺序是D,A,B,E。但事实并非如此。。。所以标记的顺序似乎很重要。按q.total\u优先级排序,t.tagName
或者如果您想根据名称控制它。。。当t.tagName='TagA'时,使用条件顺序by分配所需的优先级case;当t.tagName='TagB'时分配1;当t.tagName='TagC'时分配2;当t.tagName='TagC'时分配3;否则4 end
如果优先级与标记表一起存储,则可以避免硬编码。但我肯定我不理解这里的全部问题。每篇文章的优先级会有所不同。一篇文章可能更多地是关于TagB而不是关于TagA的,因此TagB将排名第一,而TagA将排名第二,因此在articleTags表中存储。这有帮助吗?听起来很有趣;但我只是不明白:有了模拟的数据和预期的结果,我可能会达到目的。我已经更新了问题,加入了一个例子。好吧,我差不多到了。。。所以输入的顺序很重要,因为D条和A条一样都有标签B和A。我本以为顺序是D,A,B,E。但事实并非如此。。。所以标签的顺序似乎很重要。