【问题标题】:MySQL tagging system - top keywords per monthMySQL 标记系统 - 每月热门关键词
【发布时间】:2014-02-21 19:50:53
【问题描述】:

我有一个“Has-many-through”表keyword_sentence,其中包含从句子到关键字的链接。

TABLE `keyword_sentence` {
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sentence_id` int(11) NOT NULL,
  `keyword_id` int(11) NOT NULL,
  `created` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `sentence_id` (`sentence_id`),
  KEY `keyword_id` (`keyword_id`)
)

如何获得每周排名前 5 的关键字?

我想查看每周使用哪些keyword_id,以便我可以关注热门项目。我目前有以下查询,但效果不太好。

SELECT ks.keyword_id
FROM
  keyword_sentence ks
WHERE ks.keyword_id IN (
  SELECT DISTINCT ks2.keyword_id FROM keyword_sentence ks WHERE
  from_unixtime(ks.created) >= CURRENT_DATE - INTERVAL 2 MONTH
  AND 
  from_unixtime(ks.created) < CURRENT_DATE - INTERVAL 1 MONTH
)
ORDER BY COUNT(*) DESC

【问题讨论】:

  • 您询问的是一周,但您的查询是几个月。你对哪个感兴趣?你的查询怎么没用?
  • 我想查看给定月份范围内每周前 5 个关键字。因此,如果是上个月,最多应该有 20 条记录(4 周 * 5 个关键字 = 20 个结果)。
  • 你可以使用数据库存储过程和光标在四个星期内选择每周的顶级关键字到临时表中,最后选择该临时表中的所有内容。
  • “每月热门关键字”“每周前 5 个关键字”哪个?

标签: mysql sql subquery greatest-n-per-group tagging


【解决方案1】:

试试这个查询

SELECT *
FROM (
    SELECT *, @rowNo := if(@pv = week, @rowNo+1, 1) as rNo, @pv := week
    FROM (
        SELECT keyword_id, COUNT(*), YEARWEEK(FROM_UNIXTIME(created)) AS week
        FROM keyword_sentence
        WHERE 
            FROM_UNIXTIME(created) >= CURRENT_DATE - INTERVAL 2 MONTH
        AND
            FROM_UNIXTIME(created) < CURRENT_DATE - INTERVAL 1 MONTH
        GROUP BY week, keyword_id
        ORDER BY week, COUNT(*) DESC
    ) temp
    JOIN (
        SELECT @rowNo := 0, @pv := 0
    ) tempValue
) tmp
WHERE
    tmp.rNo < 6

Fiddle

希望对你有帮助

【讨论】:

    【解决方案2】:

    我不清楚你是在寻找月份还是星期,所以我做了 MONTH。 代码如下:

    SELECT keyword_id, MONTH(from_unixtime(created)) AS theMonth, COUNT(*) As keywordCount
    FROM keyword_sentence 
    WHERE from_unixtime(created) >= CURRENT_DATE - INTERVAL 2 MONTH
    AND from_unixtime(created) < CURRENT_DATE - INTERVAL 1 MONTH
    GROUP BY keyword_id, theMonth
    ORDER BY keywordCount DESC
    

    还有小提琴:http://www.sqlfiddle.com/#!2/d76c5d/8/0

    【讨论】:

      【解决方案3】:

      你试过这个查询吗??

      SELECT DISTINCT(keyword_id) FROM tmp WHERE created BETWEEN '2014-01-01' AND '2014-02-01' LIMIT 0, 20;
      

      OR 没有 DISTINCT

      SELECT keyword_id FROM tmp WHERE created BETWEEN '2014-01-01' AND '2014-02-01' LIMIT 0, 20;
      

      然后,如果您每周有五个或更多他们出现, 希望对您有所帮助!

      【讨论】:

        【解决方案4】:

        只做一个基本的计数,按关键字和周分组:-

        SELECT keyword_id, WEEK(ks.created) AS theWeek, COUNT(*)
        FROM keyword_sentence 
        WHERE from_unixtime(created) >= CURRENT_DATE - INTERVAL 2 MONTH
        AND from_unixtime(created) < CURRENT_DATE - INTERVAL 1 MONTH
        GROUP BY keyword_id, theWeek
        

        【讨论】:

          【解决方案5】:

          你试过了吗?

          SELECT ks.keyword_id, count(*)
          FROM keyword_sentence ks
          WHERE from_unixtime(ks.created) >= CURRENT_DATE - INTERVAL 2 MONTH AND 
                from_unixtime(ks.created) < CURRENT_DATE - INTERVAL 1 MONTH
          group by ks.keyword_id
          ORDER BY COUNT(*) DESC
          limit 5;
          

          【讨论】:

          • 这只会获取上个月排名前五的关键字。我想要该月每周的前五个关键字。我知道需要一个子查询。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-13
          • 1970-01-01
          相关资源
          最近更新 更多