我有两张桌子,一张是收养宠物的家庭清单,另一张是潜在收养者名单。
有些家庭只是一次性(全部)放弃他们所有的宠物,但是有些人正在单独放弃它们(一个)。这在" 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
答案 0 :(得分:1)
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);