MYSQL查找状态失败的服务器

时间:2018-01-05 05:25:05

标签: mysql sql join left-join inner-join

我的sql表包含以下列id PKipcheck_type check_status

id      ip             check_type    check_status
1       10.10.10.10    check1        FAIL
2       10.10.10.10    check2        PASS
3       10.10.10.11    check1        PASS
4       10.10.10.11    check2        PASS

我只想要表中有ips的{​​{1}}。 因此,从上面的例子我的输出应该是Failed Check1 and Passed Check2

10.10.10.10

我收到错误

  

列ip不明确

2 个答案:

答案 0 :(得分:2)

SELECT DISTINCT
  (a.ip)
FROM table1 a
INNER JOIN table1 b
  ON a.ip = b.ip
WHERE a.check_status = 'FAIL'
AND a.check_type = 'check1'
AND b.check_status = 'PASS'
AND b.check_type = 'check2';

这将有效

你正在选择a和b中的ip,所以它给出错误,所以当你写a.ip或b.ip时它会正常工作

答案 1 :(得分:2)

使用条件聚合:

SELECT ip
FROM table1
GROUP BY ip
HAVING SUM(CASE WHEN check_type = 'check1' AND check_status = 'FAIL'
                THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN check_type = 'check2' AND check_status = 'PASS'
                THEN 1 ELSE 0 END) > 0

另一种更优雅的方式应该适用于MySQL:

SELECT ip
FROM table1
WHERE (check_type, check_status) IN (('check1', 'FAIL'), ('check2', 'PASS'))
GROUP BY ip
HAVING COUNT(DISTINCT check_type, check_status) = 2;

这是第二个查询的Demo,由@MKhalid提供