Php MySQL单次查询以获取任何活动或非活动记录

Php MySQL单次查询以获取任何活动或非活动记录,php,mysql,sql,database,join,Php,Mysql,Sql,Database,Join,我有一个场景,其中有两个表,如下所示 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 现在,我需要选择具有活动或非活动订

我有一个场景,其中有两个表,如下所示

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
现在,我需要选择具有活动或非活动订阅状态的组。
就像我在寻找活动组一样,任何一个我都应该得到Group1、Group2和Group3,因为在Group1中有一个活动订阅。如果我查询非活动组,我应该得到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
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 u.group_id
from users u
group by u.group_id
having min(u.sub_status) = 'active';    -- any active member

你不需要加入表格。 对于活动组,存在以下项:

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 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 u.group_id
from users u
group by u.group_id
having min(u.sub_status) = 'active';    -- any active member
并且不存在非活动组:

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 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 u.group_id
from users u
group by u.group_id
having min(u.sub_status) = 'active';    -- any active member

请参阅。

我想您需要这样的查询:

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 
 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 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 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值而不是字符串。

问题是什么?有些东西不行吗?我想我理解你的要求,但是,如果您将基于输入和条件的预期输出作为所需行的列表显示给我们,则会使其更为复杂obvious@kerbholz在此处查找查询这将生成非活动组:从id不在其中的组中选择名称从sub_status='Active'中的用户中选择组\u id;我不认为这应该是一个答案,tho。它不应该是SUM而不是COUNT吗?@Pepper是的,这是个错误。我修好了。谢谢你有什么理由要数一数吗?如果存在“活动”或不存在“非活动”的记录,那么仅仅查找这些记录是否就足够了?这似乎是一个更正确的答案。由于您指出的原因,我删除了我的。字段状态来自哪里?