根据条件行从另一个表中查找结果

时间:2017-03-14 19:49:42

标签: mysql

我有两张桌子,一张是收养宠物的家庭清单,另一张是潜在收养者名单。

有些家庭只是一次性(全部)放弃他们所有的宠物,但是有些人正在单独放弃它们(一个)。这在" how_many"中表示。行。

采用者考虑动物有偏好,有些只采用特定动物,其他采用不止一种。

我想要实现的是编写一个查询,将家庭与潜在的采用者联系起来。

所以,如果有一个家庭会放弃一只猫和一只鸟(不是单独的),例如威廉姆斯家族(身份证3,全部)他们将与用户4联系,他们想要采用猫和鸟(除了狗,但这并不重要,不是所有3只必须匹配,只是一个子集)。

或者,如果有一个家庭会分开放弃他们的宠物,例如史密斯家族(身份证1,一),他们将与所有想要采用鸟或猫的采用者联系,如用户1,用户2等。

有没有办法在一个查询中实现这个目标?

Families

id  animal  family      how_many

1   bird    Smith       one
1   cat     Smith       one
2   bird    Johnson     one
2   dog     Johnson     one
3   cat     Williams    all      
3   bird    Williams    all
4   bird    Brown       one
5   cat     Jones       all
6   bird    Miller      all
7   bird    Davis       one
7   cat     Garcia      one
7   bird    Garcia      one
7   dog     Garcia      one


Adopters

id  animal  adopter
1   cat     User 1
1   bird    User 1
2   bird    User 2
2   dog     User 2
3   bird    User 3
3   dog     User 4
4   cat     User 4
4   dog     User 4
4   bird    User 4
5   bird    User 5
6   bird    User 6

1 个答案:

答案 0 :(得分:1)

嗯。嗯。 。 。我认为最合理的方法是结合两个查询,一个用于"一个用于#34;一个用于"所有" s:

select f.*, a.id
from families f join
     adopters a
     on f.animal = a.animal 
where f.how_many = 'one'
union all
select f.id, group_concat(f.animal), f.family, f.how_many, a.id
from families f left join
     adopters a
     on f.animal = a.animal 
where f.how_many = 'all'
group by f.id, f.family, f.how_many, a.id
having count(*) = count(a.animal);