我正在编写一个网站并且有一个问题是什么是实现某些东西的最佳方式。它可以在PHP中执行此操作,但想知道是否有一种方法可以在SQL中执行此操作。
这是我的表:
idServidor int(11)
servidor varchar(255)
idestado int(11)
ip varchar(15)
idPlataforma int(11)
firewall tinyint(1)
comentario varchar(255)
1 mafalda 1 10.10.1.150 1 1 NA
2 mafaldavm 1 10.10.1.150 1 1 NA
3 proxy 1 10.4.4.25 2 0 NA
4 proxy-old 2 10.4.4.21 2 0 NA
5 tintoreto 1 10.4.4.20 4 1 NA
所以,现在我想从一组记录中得到,只有田地等于。如果组中的一个字段不同,则该字段应返回null或空。 仅适用于字段idestado,ip,idplataforma和防火墙。
示例,如果想在(1,2,3)中获取idServidor的equals字段,则查询shuld返回:
idestado,ip,idplataforma,firewall
1,null,null,null
对于(1,3,5)中的组idServidor:
idestado,ip,idplataforma,firewall
1,null,null,1
对于(1,2)中的组idServidor:
idestado,ip,idplataforma,firewall
1,10.10.1.150,1,1
我尝试使用此查询,但只适用于一个字段。
SELECT idestado
FROM servidores
WHERE idServidor IN (1,2,3)
GROUP BY idestado HAVING COUNT(*) = 3
提前致谢!
答案 0 :(得分:0)
我找到了一种方法,我不知道它是否是最好的,但它有效:
SELECT
(SELECT idEstado FROM servidores
WHERE idservidor IN (1, 2, 3)
GROUP BY idestado HAVING COUNT(*)=3) AS idEstado,
(SELECT ip FROM servidores
WHERE idservidor IN ( 1, 2, 3)
GROUP BY ip HAVING COUNT(*)=3) AS ip,
(SELECT idPlataforma FROM servidores
WHERE idservidor IN (1, 2, 3)
GROUP BY idPlataforma HAVING COUNT(*)=3) AS idPlataforma,
(SELECT firewall FROM servidores
WHERE idservidor IN (1, 2, 3)
GROUP BY firewall HAVING COUNT(*) =3) AS firewall
FROM dual
答案 1 :(得分:0)
无论您要比较多少行,如果列中的值都相同,那么该列的MIN和MAX将是相同的。如果该列中至少有一行具有不同的值,则MIN和MAX将不同。考虑到这一点,这是查询:
select s.idestado,
case when MIN(s.ip) = MAX(s.ip) then MIN(s.ip) else null end ip,
case when MIN(s.idPlataforma) = MAX(s.idPlataforma) then MIN(s.idPlataforma) else null end idPlataforma,
case when MIN(s.firewall) = MAX(s.firewall) then MIN(s.firewall) else null end firewall
from Servidores s
where s.idServidor in (1,2,5)
group by idestado