如何让特定标签中的顶级用户?

时间:2017-07-28 08:31:22

标签: mysql sql

我有这样的功能:

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')

现在我应该对查询进行加入吗?或者我应该修改功能?有没有人知道我该怎么做?

1 个答案:

答案 0 :(得分: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;

您可以使用简单查询实现相同的业务逻辑,而不是编写函数。然后显然只使用该查询。

您可以尝试以上查询。

在这里,我考虑过你有一些专栏,指明用户在多少天内都处于活动状态。