我有这样的功能:
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)
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;
您可以使用简单查询实现相同的业务逻辑,而不是编写函数。然后显然只使用该查询。
您可以尝试以上查询。
在这里,我考虑过你有一些专栏,指明用户在多少天内都处于活动状态。