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是的,这是个错误。我修好了。谢谢你有什么理由要数一数吗?如果存在“活动”或不存在“非活动”的记录,那么仅仅查找这些记录是否就足够了?这似乎是一个更正确的答案。由于您指出的原因,我删除了我的。字段状态来自哪里?