我的sql表包含以下列id
PK
,ip
,check_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不明确
答案 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提供