MySQL:如何按标签排序(标签数量,然后是标签的优先级)

时间:2016-11-15 20:24:55

标签: mysql

给出三个表(文章,文章标签,标签)......

通常,"相关文章按标签"根据他们匹配的原始文章标签的多少来排名。因此,如果原始文章包含TagA,TagB和TagC的标签,那么任何具有所有三个标签的相关文章将首先显示,并根据匹配的标签数量向下滴,在该数据点之后没有订单。

我想要做的是增加典型行为之后发生的行为。

如果原始文章的TagA位于优先级 1,TagB位于优先级 2,而TagC位于优先级 3,则订单仍应支持更多数量的匹配标签,但随后采用上述优先级:共享TagA(优先级1)的文章应首先出现;共享TagB的文章应该是下一个;分享TagC的文章应该是最后的。

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)

我如何存储并检索它,以便在搜索 TagA TagB 时,我会按此顺序获得此输出:

  1. A条(因为它有两者)
  2. D条(因为它有两者)
  3. B条(因为TagB是高优先级的)
  4. E条(因为TagA的优先级较低)
  5. 基本上,虽然这个例子是原始的,但它说明了需要推广B条,因为在编辑的选择和标签的优先级方面,B条与TagB的关系比条款E与标签A的关系更为明显。 / p>

    希望这有帮助。

0 个答案:

没有答案