如何使 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
所以我有一个 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