如何获取一组记录中的SQL相等字段?

时间:2016-02-25 01:13:10

标签: mysql sql

我正在编写一个网站并且有一个问题是什么是实现某些东西的最佳方式。它可以在PHP中执行此操作,但想知道是否有一种方法可以在SQL中执行此操作。

这是我的表:

Servidores

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

提前致谢!

2 个答案:

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