gpt4 book ai didi

mysql - 我应该使用 DISTINCT 吗?

转载 作者:行者123 更新时间:2023-11-29 12:43:48 25 4
gpt4 key购买 nike

我有一个程序,其版本和 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的一个结果(最大的版本)。

最佳答案

要获取每个 IP 的最大版本,您可以使用以下简单查询:

SELECT
MAX(Version) AS MaxVersion,
LastIP
FROM
gts.Operadores
GROUP BY
LastIP
;

如果您想另外返回与每对特定的 MaxVersionLastIP 关联的 Usuario,您可以通过将结果连接回来来实现至 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 <b>DISTINCT</b>
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,则应指定所需的行。例如,您可以选择每个(最大)版本和 IP 的最大 Usuario:

SELECT
<b>MAX(o.Usuario) AS Usuario</b>,
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
<b>GROUP BY
o.Version,
o.LastIP</b>
;

关于mysql - 我应该使用 DISTINCT 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25730387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com