Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:如何按标签排序(标签数量,然后是标签优先级)_Mysql - Fatal编程技术网

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

MySQL:如何按标签排序(标签数量,然后是标签优先级),mysql,Mysql,给出三个表(文章、文章标签、标签) 通常,“按标签列出的相关文章”是根据它们匹配的原始文章标签数量进行排名的。因此,如果原始文章具有TagA、TagB和TagC标记,那么也具有所有三个标记的任何相关文章都将首先显示,并根据匹配的标记数量向下延伸,在该数据点之后没有顺序 我想做的是增加在典型行为之后发生的行为 如果原始文章的TagA优先级为1,TagB优先级为2,TagC优先级为3,则顺序仍应倾向于更多匹配的标记,但随后应采用上述优先级:共享TagA(优先级为1)的文章应首先出现;接下来是分享Ta

给出三个表(文章、文章标签、标签)

通常,“按标签列出的相关文章”是根据它们匹配的原始文章标签数量进行排名的。因此,如果原始文章具有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)
我如何存储并检索它,以便在搜索TagATagB时,按以下顺序获得此输出:

  • 第A条(因为它两者都有)
  • D条(因为这两条都有)
  • 第B条(因为TagB是高度优先事项)
  • 第E条(因为TagA的优先级较低)
  • 基本上,虽然这个例子是原始的,但它说明了提升文章B的必要性,因为在编辑选择和优先标记时,文章B与TagB的关系比文章E与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。但事实并非如此。。。所以标签的顺序似乎很重要。