使用条件从Map表中选择不同的记录

ibrsph3r  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(297)

在mysql数据库中,我有以下表:

我想选择的用户谁只拥有鸟类和没有其他宠物计数。
到目前为止,我想到了这个: SELECT COUNT(DISTINCT(user_id)) FROM users_pets_map WHERE pet_id IN (SELECT id FROM pets WHERE animal = 'bird') 但它不能满足不拥有其他动物的要求。

k4emjkb1

k4emjkb11#

你可以用 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

f3temu5u

f3temu5u2#

您可以执行以下操作:

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 count然后你可以做:

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

wf82jlnq3#

您可以按以下方式修改查询:

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

最后一个子查询将获取不是鸟的宠物id,它之外的查询将获取拥有非鸟的动物的用户。最后,结合您当前的查询,它将为您获取没有任何其他动物以及鸟类的用户。尽管就时间复杂性而言,上面的查询不是最好的解决方案,但它是许多解决方案中的一个,而且更容易理解。

相关问题