2017-07-28 56 views
-1

我有这样的功能:如何获得特定标签中的顶级用户?

CREATE DEFINER=`root`@`localhost` FUNCTION `user_top_tags`(`user_id` INT, `tags_num` TINYINT(1)) RETURNS varchar(50) CHARSET utf8mb4 
    NO SQL 
BEGIN 
    DECLARE top_tags varchar(50); 

    SELECT substring_index(group_concat(x.name ORDER BY x.tag_score DESC SEPARATOR ','), ',', tags_num) INTO top_tags 
    FROM (
     SELECT t.name, sum(r.score) AS tag_score 
     FROM reputations r 
     JOIN qanda_tags qt ON qt.qanda_id = r.question_id 
     JOIN tags t ON t.id = qt.tag_id 
     WHERE r.owner_id = user_id 
     GROUP BY t.name 
    ) x; 

    RETURN top_tags; 
END 

我这样称呼它:

SELECT u.name, user_top_tags(u.id, 3) FROM users u WHERE 1; 

,并返回用户的列表与他们的前三大标签。这样的事情:

+--------+-----------------+ 
| Jack | php,oop,mysql | 
| Martin | css,js,html  | 
| Peter | jquery,js,react | 
+--------+-----------------+ 

现在我想要得到在特定标记中处于活动状态的用户。类似于SO 中的top users page(用于javascript标记,但我想获取多个标记中的用户列表,例如IN ('css','html')

现在我应该对查询进行连接吗?或者我应该修改该功能?有谁知道我该怎么做?

+0

你可以加入你的查询。 –

+0

@SagarGangwal是的,我想你是对的。我正在尝试......':-)'我想我必须使用'having'从句。 –

+0

是的,如果你使用的是GROUP BY,那么HAVING是最好的选择,而不是'where'。 –

回答

0
SELECT substring_index(group_concat(x.name ORDER BY x.tag_score DESC SEPARATOR ','), ',', 3) as top_tags,x.username 
    FROM (
     SELECT u.name username,t.name, sum(r.score) AS tag_score 
     FROM reputations r 
     JOIN qanda_tags qt ON qt.qanda_id = r.question_id 
     JOIN tags t ON t.id = qt.tag_id 
     INNER JOIN users u ON u.id = r.owner_id 
     GROUP BY t.name,u.name 
     having u.active < 10 
    ) x; 

而不是写功能,你可以使用简单的查询来实现相同的业务逻辑。那么很明显,只能使用该查询。

您可以尝试以上查询。

在这里,我认为你有一些列指定用户从多少天活跃。

相关问题