mysql SELECT EXISTS在多个表上

时间:2015-05-21 14:42:43

标签: mysql

有桌子:person,person_ip

两个表都有pid列作为主键,在表person中有列state_id,在表person_ip中有列ip。< / p>

想要发现是否为state_id不等于2的人分配了指定的IP地址。但总是得到结果1,即使state_id012。只有在根本没有列出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'
)

2 个答案:

答案 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