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