在同一个表中使用不同搜索的Mysql查询

Sco*_*ott 2 mysql sql

我想做的是在一个有两个不同值的表中搜索,这很难解释,所以我只举一个例子.

表:人

+----------------+
| id     name    |
|----------------|
| 1      Bob     |
| 2      Jack    |
| 3      Waly    |
| 4      Alex    |
++++++++++++++++++
Run Code Online (Sandbox Code Playgroud)

表:动物

+------------------------------------------+
| id   person    key          value        |
|------------------------------------------|
| 1    1         dog          Terrier      |
| 2    1         dog          Shepherd     |
| 3    1         bird         African Grey |
| 4    3         cat          Toyger       |
| 5    3         cat          Korat        |
| 6    2         dog          Terrier      |
++++++++++++++++++++++++++++++++++++++++++++
Run Code Online (Sandbox Code Playgroud)

例如:我希望能够选择那只有狗是非洲犬和非洲鸟的人,所以它应该返回1(鲍勃).我需要能够添加和删除参数我可能只想让有狗狗的人应该返回1(Bob)和2(Jack).

我已经尝试过基本的sql,但已经让它工作了,因为当你限制键时你可以搜索另一个.以下查询是我尝试过的,我想返回:1(Bob).

SELECT p.id, p.name
FROM people p, animals a
WHERE p.id = a.person
AND (a.key = 'dog' AND a.value LIKE '%Terrier%' )
AND (a.key = 'bird' AND a.value LIKE '%African%' )
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我想把所有的动物行放在同一张桌子上,这样我就不必把它们分开了.感谢您所有的帮助!

And*_*mar 5

您需要多次查表,每次查找特定的动物.例如,使用双连接:

select  *
from    people p
join    animals a1
on      a1.person = p.id
join    animals a2
on      a2.person = p.id
where   a1.key = 'dog' and a1.value like '%Terrier%'
        and a2.key = 'bird' and a2.value like '%African%'
Run Code Online (Sandbox Code Playgroud)

或者存在双重:

select  *
from    people p
where   exists
        (
        select  *
        from    animals a
        where   a.person = p.id
                and a.key = 'dog' 
                and a.value like '%Terrier%'
        )
        and exists
        (
        select  *
        from    animals a
        where   a.person = p.id
                and a.key = 'bird' 
                and a.value like '%African%'
        )
Run Code Online (Sandbox Code Playgroud)