我有一个程序会将其版本和IP报告给下表
CREATE TABLE `Operadores` (
`Num` int(11) NOT NULL AUTO_INCREMENT,
`Usuario` varchar(45) NOT NULL,
`Password` varchar(15) NOT NULL,
`LastLogin` varchar(25) DEFAULT '01/01/1970 00:00:00',
`AdminLevel` int(10) unsigned DEFAULT '1',
`Grupo` varchar(20) NOT NULL DEFAULT 'Operadores',
`Version` varchar(20) DEFAULT 'OLD',
`NombrePC` varchar(20) DEFAULT NULL,
`LastIP` varchar(16) DEFAULT '0.0.0.0',
PRIMARY KEY (`Num`,`Usuario`),
UNIQUE KEY `Num_UNIQUE` (`Num`),
UNIQUE KEY `Usuario_UNIQUE` (`Usuario`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=l
版本保存为1.5.4.3,我在点之间只使用一位数;如此大的数字意味着更大的版本。
我需要在MySQL Workbench中进行查询,以了解每个IP的更大版本。
实施例: 如果最后一个版本是1.6.0.2并且我有以下数据
Usuario Version LastIP
Mike 1.6.0.1 10.0.1.1
Eric 1.6.0.2 10.0.1.1
Adam 1.1.0.1 10.0.1.2
Clark 1.6.0.2 10.0.1.2
Kirk 1.6.0.0 10.0.1.3
我应该获得
Usuario Version LastIP
Eric 1.6.0.2 10.0.1.1
Clark 1.6.0.2 10.0.1.2
Kirk 1.6.0.0 10.0.1.3
现在我可以看到PC 10.0.1.3上的Kirk正在使用旧版本的软件。
我已经尝试了
SELECT * FROM gts.Operadores GROUP BY VersionGTS,LastIP ORDER BY LastLogin DESC;
但是我按每条记录获得一行,我只想为每个IP获得一个结果(最大版本)。
答案 0 :(得分:1)
要获得每个IP的最大版本,您可以使用以下简单查询:
SELECT
MAX(Version) AS MaxVersion,
LastIP
FROM
gts.Operadores
GROUP BY
LastIP
;
如果您想要额外返回与Usuario
和MaxVersion
的每对特定关联的LastIP
,您可以通过将结果重新加入gts.Operadores
来实现这一目标:
SELECT
o.Usuario,
o.Version,
o.LastIP
FROM
gts.Operadores AS o
INNER JOIN
(
SELECT
MAX(Version) AS MaxVersion,
LastIP
FROM
gts.Operadores
GROUP BY
LastIP
) AS m
ON
o.LastIP = m.LastIP
AND o.Version = m.MaxVersion
;
如果用户从相同的IP登录并且具有恰好是该IP的最大版本的相同版本,则上述查询将返回重复的条目。使用DISTNCT
:
SELECT DISTINCT
o.Usuario,
o.Version,
o.LastIP
FROM
gts.Operadores AS o
INNER JOIN
(
SELECT
MAX(Version) AS MaxVersion,
LastIP
FROM
gts.Operadores
GROUP BY
LastIP
) AS m
ON
o.LastIP = m.LastIP
AND o.Version = m.MaxVersion
;
但是,如果多个用户共享相同的IP,则最后一个查询可能仍会为每个IP提供多个行。如果您坚持只为每个IP获取一行并且您坚持每行都有一个(对应的)Usuario
,那么您应该指定所需的行。例如,您可以选择最大Usuario
每(最大)版本和IP:
SELECT
MAX(o.Usuario) AS Usuario,
o.Version,
o.LastIP
FROM
gts.Operadores AS o
INNER JOIN
(
SELECT
MAX(Version) AS MaxVersion,
LastIP
FROM
gts.Operadores
GROUP BY
LastIP
) AS m
ON
o.LastIP = m.LastIP
AND o.Version = m.MaxVersion
GROUP BY
o.Version,
o.LastIP
;
答案 1 :(得分:0)
您获得两行的原因是您在group by
子句VersionGTS,LastIP
中使用了两列。
如果您只想获得一个值,那么您可以使用max
函数获取Version
列的最大版本,请尝试以下操作:
SELECT max(versionGTS),LastIP,LastLogin
FROM gts.Operadores
GROUP BY LastIP,LastLogin
ORDER BY LastLogin DESC;
答案 2 :(得分:0)
如果你做了一些事情(请原谅我正在抨击它的语法)
SELECT MAX(CONVERT(IP, INT)) -- Have to strip out the periods and use it as an INT I would suppose
FROM gts.operadores
GROUP BY USUARIO
应该为每个组提供最大值IP