如何使 MYSQL GROUP_CONCAT 结果不同并按出现次数排序

How to make MYSQL GROUP_CONCAT result distinct and ordered by number occurrences

所以我有一个 table 看起来像下面的

 tool_id   |  tool_user 
  hammer        adam
  hammer        adam
  hammer        sandra
 screwdriver    sandra

所以我正在尝试 select 按使用次数(记录出现次数)排序的工具,并将所有用户连接到一个字段中,棘手的部分是按出现次数对用户进行计数和排序还有

到目前为止,我能够按使用情况获取工具并对其进行排序,但我不确定如何按出现次数对用户进行排序。

select语句的预期结果是:

tool          users
hammer       adam,sandra
screwdriver  sandra

当前 SQL 语句如下所示:

SELECT tool_id, GROUP_CONCAT(tool_user SEPARATOR ",") AS tool_users, COUNT(*) AS count FROM tools_table GROUP BY tool_id ORDER BY count DESC LIMIT 5

首先执行查询以将每个工具和用户的行减少到一个:

select tool_id, tool_user, count(*) as count from tools_table group by tool_id, tool_user;
+-------------+-----------+-------+
| tool_id     | tool_user | count |
+-------------+-----------+-------+
| hammer      | adam      |     2 |
| hammer      | sandra    |     1 |
| screwdriver | sandra    |     1 |
+-------------+-----------+-------+

然后您可以将该查询包装在另一个查询中以执行组连接:

select tool_id, group_concat(tool_user order by count desc) as users from (
  select tool_id, tool_user, count(*) as count from tools_table group by tool_id, tool_user
) as t
group by tool_id;
+-------------+-------------+
| tool_id     | users       |
+-------------+-------------+
| hammer      | adam,sandra |
| screwdriver | sandra      |
+-------------+-------------+

只需添加一个 Distinct

SELECT 
  tool_id, GROUP_CONCAT(DISTINCT tool_user SEPARATOR ",") AS tool_users
FROM tools_table 
GROUP BY tool_id 
ORDER BY COUNT(DISTINCT tool_user) DESC LIMIT 5

给你

tool_id       tool_users    
hammer        adam,sandra   
screwdriver   sandra

例子https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=972b29cff86121dc497d1827fbc3f1ab