簡體   English   中英

Select 每個分組列只有 2 行數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM