我应该使用DISTINCT吗?

时间:2014-09-08 18:02:53

标签: mysql sql

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

3 个答案:

答案 0 :(得分:1)

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

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

如果您想要额外返回与UsuarioMaxVersion的每对特定关联的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