2014-09-08 2 views
0

나는 다음 표DISTINCT를 사용해야합니까?

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로 저장됩니다 자사의 버전 및 IP를보고 프로그램을 가지고, 나는 점 사이의 하나 개의 숫자를 사용; 너무 큰 숫자는 더 큰 버전을 의미합니다.

각 IP의 더 큰 버전을 알기 위해 MySQL Workbench에서 쿼리를 작성해야합니다.

예 : 마지막 버전은 1.6.0.2이며, 나는 커크 그 PC 10.0.1.3에 볼 수 있습니다

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 

을 받아야 다음과 같은 데이터가있는 경우 는 이전 버전의 소프트웨어를 사용하고 있습니다.

이미

SELECT * FROM gts.Operadores GROUP BY VersionGTS,LastIP ORDER BY LastLogin DESC; 

과 노력하지만 모든 레코드가 하나 개의 행을 얻을, 난 그냥 각 IP에 대한 하나 개의 결과 (최대 버전)합니다.

+2

SELECT 최대 (버전), lasIP t 그룹에서 lasIP LastLogin' BY – Mihai

답변

0

두 행을 얻는 이유는 group by 절의 두 열을 사용하기 때문입니다. VersionGTS,LastIP.

당신은 당신이 시도 Version 컬럼의 최대 버전을 얻을 수있는 max 기능을 사용할 수 있습니다 하나 개의 값을 얻고 싶다면 :

SELECT max(versionGTS),LastIP,LastLogin 
FROM gts.Operadores 
GROUP BY LastIP,LastLogin 
ORDER BY LastLogin DESC; 
+0

'ORDER BY : 예를 들어, 최대 Usuario 당 (최대) 버전 및 IP를 선택할 수 있을까?당신은'LastLogin'을 당기지 않습니다. –

+0

@AndriyM : - 네, 문제가있는 부분에 집중했습니다. 그러나 좋은 선택. 업데이트 됨. 감사합니다 :) –

+0

어 - 오, 이제 당신은'LastLogin'을 당기고 있지만 그것에 의해 그룹화되지 않습니다. 오, 변태 된 것들 MySQL은 GROUP BY로 할 수 있습니다 ... –

0

당신은 무엇을의 라인을 따라 뭔가 (용서를 한 경우 구문 나는

+0

LastIP가 아닌 Version의 최대 값이 필요합니다. 각기 다른 LastIP별로 하나의 결과가 필요합니다. –

+0

@E_Blue : - 내 대답에 게시 한 쿼리 결과가 표시되지 않습니까? –

+0

내가 내 의견을 게시 할 때 쿼리를 테스트하지 않았으므로 지금 무엇을하려고 하는지를 읽었습니다. 이제 시도해 보았고 MySQL Workbench가 INT라는 단어를 말했습니다. –

1

IP 당 최대 버전을 얻으려면, 당신은이 S 사용할 수 있습니다

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를 부여 함)를 해결 해보려고 하는것입니다 imple 쿼리

당신이 추가로 MaxVersionLastIP의 모든 특정 쌍과 관련된 Usuario을 반환하려면
SELECT 
    MAX(Version) AS MaxVersion, 
    LastIP 
FROM 
    gts.Operadores 
GROUP BY 
    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에 대해 최대 버전 인 경우 위의 쿼리는 중복 항목을 반환합니다. 여러 사용자가 동일한 IP를 공유하는 경우

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 당 당신에게 여러 행을 줄 수도 있습니다 : DISTNCT으로 그들을 제거 쉽습니다. 모든 IP에 대해 하나의 행만 가져오고 모든 행에 (대응하는) Usuario이 있어야한다고 주장하면 원하는 행을 지정해야합니다.

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 
;
관련 문제