Select 与映射 table 有条件的不同记录
Select distinct record from mapping table with condition
在我的 MySQL 数据库中,我有这些表:
我想select只拥有鸟类而没有其他宠物的用户数量。
到目前为止我已经想到了这个:
SELECT COUNT(DISTINCT(user_id)) FROM users_pets_map WHERE pet_id IN (SELECT id FROM pets WHERE animal = 'bird')
但不满足不拥有其他动物的条件
您可以进行聚合:
select m.user_id, count(*)
from user_pets_map m inner join
pets p
on p.id = m.pet_id
group by m.user_id
having sum( p.animal <> 'bird' ) = 0;
换个方式,你也可以这样做:
select m.user_id, count(*)
from user_pets_map m inner join
pets p
on p.id = m.pet_id
group by m.user_id
having min(p.animal) = max(p.animal) and min(p.animal) = 'bird';
编辑: 如果你只想 User
s 计数,那么你可以这样做:
select count(distinct m.user_id)
from user_pets_map m
where not exists (select 1 from user_pets_map m1 where m1.user_id = m.user_id and m1.pet_id <> 3);
您可以使用 GROUP BY
和 HAVING
SELECT COUNT(DISTINCT(user_id)) FROM users_pets_map
WHERE pet_id IN (SELECT id FROM pets WHERE animal = 'bird')
GROUP BY pet_id HAVING COUNT(distinct pet_id)=1
您可以按如下方式修改您的查询:
SELECT COUNT(DISTINCT(user_id)) FROM users_pets_map WHERE pet_id IN (SELECT id
FROM pets WHERE animal = 'bird') AND user_id NOT IN (SELECT user_id FROM
users_pets_map WHERE pet_id IN (SELECT id FROM pets WHERE animal <> 'bird'))
最后一个子查询将获取 pet_id 不是鸟类的用户,它之外的查询将获取拥有非鸟类动物的用户。最后结合您当前的查询,它将为您获取没有任何其他动物但有鸟的用户。虽然上述查询在时间复杂度方面不是最好的解决方案,但它是众多解决方案之一,也更容易理解。
在我的 MySQL 数据库中,我有这些表:
我想select只拥有鸟类而没有其他宠物的用户数量。
到目前为止我已经想到了这个:
SELECT COUNT(DISTINCT(user_id)) FROM users_pets_map WHERE pet_id IN (SELECT id FROM pets WHERE animal = 'bird')
但不满足不拥有其他动物的条件
您可以进行聚合:
select m.user_id, count(*)
from user_pets_map m inner join
pets p
on p.id = m.pet_id
group by m.user_id
having sum( p.animal <> 'bird' ) = 0;
换个方式,你也可以这样做:
select m.user_id, count(*)
from user_pets_map m inner join
pets p
on p.id = m.pet_id
group by m.user_id
having min(p.animal) = max(p.animal) and min(p.animal) = 'bird';
编辑: 如果你只想 User
s 计数,那么你可以这样做:
select count(distinct m.user_id)
from user_pets_map m
where not exists (select 1 from user_pets_map m1 where m1.user_id = m.user_id and m1.pet_id <> 3);
您可以使用 GROUP BY
和 HAVING
SELECT COUNT(DISTINCT(user_id)) FROM users_pets_map
WHERE pet_id IN (SELECT id FROM pets WHERE animal = 'bird')
GROUP BY pet_id HAVING COUNT(distinct pet_id)=1
您可以按如下方式修改您的查询:
SELECT COUNT(DISTINCT(user_id)) FROM users_pets_map WHERE pet_id IN (SELECT id
FROM pets WHERE animal = 'bird') AND user_id NOT IN (SELECT user_id FROM
users_pets_map WHERE pet_id IN (SELECT id FROM pets WHERE animal <> 'bird'))
最后一个子查询将获取 pet_id 不是鸟类的用户,它之外的查询将获取拥有非鸟类动物的用户。最后结合您当前的查询,它将为您获取没有任何其他动物但有鸟的用户。虽然上述查询在时间复杂度方面不是最好的解决方案,但它是众多解决方案之一,也更容易理解。