2017-07-28 54 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; 

而不是寫功能,你可以使用簡單的查詢來實現相同的業務邏輯。那麼很明顯,只能使用該查詢。

您可以嘗試以上查詢。

在這裏,我認爲你有一些列指定用戶從多少天活躍。

相關問題