有桌子:person,person_ip
两个表都有pid
列作为主键,在表person
中有列state_id
,在表person_ip
中有列ip
。< / p>
想要发现是否为state_id
不等于2
的人分配了指定的IP地址。但总是得到结果1
,即使state_id
是0
,1
或2
。只有在根本没有列出IP地址时才始终获得0
。我做错了什么?
SELECT EXISTS (
SELECT person_ip.PID
FROM person_ip,person
WHERE person.PID=person_ip.PID
AND person.state_id NOT IN (2)
AND person_ip.ip='10.11.12.13'
)
答案 0 :(得分:1)
这看起来像一个简单的join
..除非我遗漏了什么
select person.*
from person
inner join person_ip
on person.pid = person_ip.pid
where person.state_id <> 2
and person_ip.ip_address = '10.0.0.1'
如果要排除ip_address(如果已将其分配给state = 2的任何用户),即使它已分配给没有state = 2的用户,也请尝试:
select max(i)
from (
select *
from (
select 1 as i
from dual
where not exists (
select 1
from person p
inner join person_ip pi
on p.pid = pi.pid
where p.state_id = 2
and pi.ip_address = '10.0.0.1'
)
) q
union
select 0
) qq
(dual是一个可以用作一种存根表的系统表)
here's a fiddle showing both versions
在实际睡眠后更新
好的,所以上面的查询有点..那里。回到现实世界,这个可能更合适:
select count(case when p1.state_id = 2 then 1 end)
from person p1
inner join person_ip pi1
on p1.pid = pi1.pid
where pi1.ip_address = '10.0.0.1'
group by pi1.ip_address;
如果你的ip_address已被state_id为2的人使用,则返回1或更多,如果state_id为2的人从未使用过,则返回0。
如果从未使用过ip,它将不返回任何内容。
this fiddle包含以上三种查询。
答案 1 :(得分:-1)
SELECT IF(COUNT(*)>0,1,0)
FROM person
INNER JOIN person_ip
ON person.pid = person_ip.pid
AND person_ip.ip_address = '10.0.0.1'
WHERE person.state_id <> 2