[英]Select only 2 rows of data per grouped column
我的數據庫中有三個表,出於討論的目的,假設它們是:
USERS
-----
id
display_name
ROLES
-----
id
role
USER_ROLES
----------
user_role_id
user_id
role_id
如您所見,1 個用戶可以擁有多個角色。 現在,我已使用以下查詢成功地將它們分組為他們的角色。
SELECT r.`name`, GROUP_CONCAT(u.display_name) AS users_for_role
FROM users u,
roles r,
user_roles ur
WHERE u.id = ur.user_id
AND r.id = ur.role_id
GROUP BY r.id;
並得到了類似的結果
| ROLE_USER | user1,user6,user4 |
| ROLE_CELEBRITY | user4,user5,user6 |
| ROLE_MUSICIAN | user4 |
現在我想要實現的是我想將 select 計數限制為最大 2。所以我的預期結果是 ROLE_USER 只選擇“user1”和“user6”MAX
您可以在這里使用的一個技巧是僅使用SUBSTRING_INDEX
包裝您當前對GROUP_CONCAT
的調用,最多只保留前兩個條目:
SELECT r.name, SUBSTRING_INDEX(GROUP_CONCAT(u.display_name), ',', 2) AS users_for_role
FROM users u
INNER JOIN roles r ON u.id = ur.user_id
INNER JOIN user_roles ur ON r.id = ur.role_id
GROUP BY r.id;
另一種更正式的方法是使用帶有ROW_NUMBER
的子查詢來限制每個名稱的前兩個條目:
WITH cte AS (
SELECT r.id, r.name, u.display_name,
ROW_NUMBER() OVER (PARTITION BY r.name ORDER BY u.display_name) rn
FROM users u
INNER JOIN roles r ON u.id = ur.user_id
INNER JOIN user_roles ur ON r.id = ur.role_id
)
SELECT name, GROUP_CONCAT(display_name) AS users_for_role
FROM cte
WHERE rn <= 2
GROUP BY id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.