我有这样的功能:
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 中的顶级用户页面(用于javascript
标记,但我想获取多个标记中的用户列表,例如IN ('css','html')
)。
现在我应该加入查询吗?还是我应该修改功能?有谁知道我该怎么做?
让我们假设这些是问题的设置。这些将是表格:
这些是存储在不同表中的值:
此时,我们可以运行此查询...
并得到
您的原始函数(稍作修改,因此它实际上不是一个函数,可以在 dbfiddle 上播放,并提供一些额外信息),将执行以下操作:
(这些将是您的函数参数)
如果你想限制检查的标签,你可以稍微改变之前的代码:
现在将返回:
如果设置为 NULL ,前面的代码也将起作用并选择所有标签。
@tags_list
在那种情况下,@tags_list IS NULL
为真,并且 JOIN 条件等同于原始情况。您可以在dbfiddle此处查看所有内容