从条件映射表中选择不同的记录

时间:2018-12-28 09:04:12

标签: mysql sql distinct

在我的MySQL数据库中,我有这些表:

enter image description here

我想选择仅拥有鸟而没有没有其他宠物的用户数。

到目前为止,我已经想到了这一点:

SELECT COUNT(DISTINCT(user_id)) FROM users_pets_map WHERE pet_id IN (SELECT id FROM pets WHERE animal = 'bird')

但它不能满足不拥有其他动物的要求。

3 个答案:

答案 0 :(得分:2)

您可以进行聚合:

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,则可以:

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);

答案 1 :(得分:1)

您可以使用GROUP BYHAVING

   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

答案 2 :(得分: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,它之外的查询将获取具有鸟以外动物的用户。最后结合您当前的查询,它将获取您没有其他动物而且有鸟的用户。尽管从时间复杂度上讲,上述查询并不是最佳的解决方案,但它是许多解决方案之一,而且更易于理解。