簡體   English   中英

如果任何記錄處於活動狀態或非活動狀態,MySQL 單個查詢以獲取記錄

[英]MySQL single query to get the records if any record is active or inactive

我有一個場景,其中有 2 個表,如下所示

groups

id| name
1 | Group 1
2 | Group 2
3 | Group 3


users

id| name | group_id | sub_status
1 | John | 1        | Active
2 | Doe  | 1        | Inactive
3 | Simon| 2        | Active
4 | David| 3        | Active

現在我需要選擇具有活動或非活動訂閱狀態的組。 就像我在尋找Active組一樣,任何一個我都應該得到 Group1、Group2 和 Group3,因為在 Group 1 中有一個 Active 訂閱。如果我查詢Inactive組,我應該得到null因為 Group1 有一個活動訂閱

您可以按每個組計算活動和非活動記錄。 之后,您可以按該計數過濾組。 例如,您可以使用以下查詢查找活動組

SELECT 
 groups.id,
 groups.name,
 sum(IF(users.sub_status = 'Active', 1, 0)) as active_count 
 sum(IF(users.sub_status = 'Inactive', 1, 0)) as inactive_count  
FROM groups
LEFT JOIN users ON users.group_id = group.id
GROUP BY groups.id, groups.name
HAVING active_count > 0

和非活動組:

SELECT 
 groups.id,
 groups.name,
 sum(IF(users.sub_status = 'Active', 1, 0)) as active_count 
 sum(IF(users.sub_status = 'Inactive', 1, 0)) as inactive_count  
FROM groups
LEFT JOIN users ON users.group_id = group.id
GROUP BY groups.id, groups.name
HAVING active_count = 0

您不需要加入表。
活動組的 EXISTS:

select g.* from groups g
where exists (
  select 1 from users
  where group_id = g.id and sub_status = 'Active'
);

並且不存在非活動組:

select g.* from groups g
where not exists (
  select 1 from users
  where group_id = g.id and sub_status = 'Active'
);

請參閱演示

我想你需要這樣的查詢:

select g.id, 
       case when count(case when u.sub_status = 'Inactive' then 1 end)=1 and 
                 count(case when u.sub_status = 'Active' then 1 end) > 0
            then
         null
       else  
         g.name
       end inactive_case,
       case when count(case when u.sub_status = 'Active' then 1 end) = 1 then
         g.name
       end active_case
  from groups g
  left join users u on u.group_id = g.id
 group by g.id, g.name;

 id inactive_case   active_case
 1                  Group 1
 2  Group 2         Group 2
 3  Group 3         Group 3

演示

您可以為此使用聚合:

對於活動組:

select u.group_id
from users u
group by u.group_id
having min(u.sub_status) = 'active';    -- any active member

對於不活動:

select u.group_id
from users u
group by u.group_id
having min(u.sub_status) = 'inactive';  -- all inactive

這使用了'active' > 'inactive'的事實。 為此,我建議使用 0/1 值而不是字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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