![](/img/trans.png)
[英]How to group records displaying total value according to 2 fields of sql table?
[英]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.