繁体   English   中英

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

[英]How to obtain SQL equal fields in a group of records?

我正在编程一个网站,但有一个问题是什么是实现某件事的最佳方法。 它可以在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字段,则查询应返回:

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

提前致谢!

我找到了一种方法,我不知道这是否是最好的方法,但是它可以工作:

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

无论您要比较多少行,如果该列中的值都相同,则该列的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM