2012-04-24 2 views
6

Table1 3 열이 있습니다 col1, col2, col3가 특정 값과 동일 col1의 I SELECT 모든 DISTINCT 값은 다음 col2 DESC하여 분류, 아직 뚜렷한 col1 결과를 보여줄 수 있습니다 어떻게 col3두 열을 선택하는 방법. 한 열은 DISTINCT 여야합니다?

을 자신의 col2 값을 해당 ?

나는 다음과 같은 시도했지만 작동하지 않았다 :

SELECT DISTINCT (col1), col2 
FROM `Table1` 
WHERE `col3` = 'X' 
ORDER BY `col2` DESC 

col1의 고유 한 값을 초래하지 않습니다. ", col2"을 제거하면 col1의 고유 값이 표시되지만 해당 col2 값은 표시되지 않습니다.

그럼 어떻게해야합니까? 나는 당신을 믿고있어

+0

'뚜렷한 구분'은 개별 필드가 아닌 전체 행에 적용됩니다. –

+3

Col2에서 어떤 가치를 원하십니까? 각각의 col1에 대해 많은 다른 값이있을 것입니까? – ManseUK

+0

@Marc B, 고마워. 그런데 어떻게 전체 행의 모든 ​​열을 보여줄 수 있을까? – ProgrammerGirl

답변

9

이 같은 아마 뭔가 :

SELECT col1, MAX(col2) col2_max 
FROM Table1 
WHERE col3 = 'X' 
GROUP BY col1 
ORDER BY col2_max 

?

SQL Fiddle에서 재생할 수 있습니다.

+0

이 답변이 누락 된 전부는 'ORDER BY col2_max'다음에 'DESC'를 추가하는 것입니다.하지만이 방법이 효과적입니다! 나는 간단하고 솔직한 해결책이 있어야한다는 것을 알고있었습니다. 당신이 나를 SQL Fiddle에 소개했기 때문에 나는 대답을 해주고 있습니다. 감사! – ProgrammerGirl

1

col1에 대한 col2을 가장 원하는 :

SELECT tm.* 
FROM (
     SELECT DISTINCT col1 
     FROM table1 
     WHERE col3 = 'X' 
     ) t 
JOIN table tm 
ON  id = 
     (
     SELECT id 
     FROM table1 ti 
     WHERE ti.col3 = 'X' 
       AND ti.col1 = t.col1 
     ORDER BY 
       col2 DESC 
     LIMIT 1 
     ) col2 
ORDER BY 
     col2 DESC 

빠른 작동이에 대한 (col3, col1, col2)에 인덱스를 만듭니다.

업데이트 : 당신은이 두 개의 열이 필요한 경우

, 쿼리가 실제로 더 간단 할 수있다 :

SELECT col1, MAX(col2) AS maxcol2 
FROM table1 
WHERE col3 = 'X' 
GROUP BY 
     col1 
ORDER BY 
     maxcol2 DESC 

을하지만 당신은 possbily 추가 필드와 함께 (전체 기록을 필요로하는 경우 표에 포함되어 있음), 초기 구문이 필요합니다.

+1

와우, 내 무지를 용서해주십시오.하지만 그렇게 간단한 쿼리는 복잡한 쿼리를 필요로합니까?col2 DESC에 의해 정렬 된 DISTINCT (col1)를 반환하도록 MySQL에 지시 한 다음 각 행에 해당 col3 값을 표시하는 방법은 없습니까? – ProgrammerGirl

+0

@programmer : 'col1'은 같지만 'col2'가 다른 레코드가 두 개있는 경우 쿼리가 반환해야하는 레코드는 무엇입니까? – Quassnoi

+0

@Programmer : 신경 끄시 고, 원래 게시물에 대한 귀하의 의견을 보았습니다. 예, 복잡한 쿼리가 필요합니다. 'PostgreSQL'에서는'Oracle 8i +'와'SQL Server 2005 +'(그리고'PostgreSQL 8.4 +')에서'ROW_NUMBER()'를 사용할 수있는'DISTINCT ON'을 사용할 수 있습니다. 'MySQL'에서는 이것을 필요로합니다. – Quassnoi

-1
SELECT t.col1, max(t.col2) 
    FROM Table1 t 
WHERE t.col3='X' 
GROUP BY t.col1 
ORDER BY t.col2 DESC; 

편집 :이 답변이 가장 정확 하나를 유지, 몇 가지 수정이 있었다.

+0

이것은 단지'col3 = 'X ''를 가진 모든 레코드를 반환 할 것입니다. – Quassnoi

+0

-1 - 바깥 쿼리의 여러 유사한 값이 하위 쿼리에서 반환 된 단일 값과 일치하므로 무시할 수없는 행을 반환하지 않습니다. SQL은 세트 기반이며, 행이 사용 된 후에는 '제거'되지 않습니다. –

+0

@ X-Zero : 실제로이 연산자는 op가 요청한 것을 반환합니다 (불필요하게 복잡하고 중첩 된 쿼리가 중복되는 것을 제외하고는). – Quassnoi

3

내가 MySQL의는 GROUP BY 절을 지원하는 확신, 그리고 당신이 col2의 원하는 주어진이 당신에게 결과를 얻을해야 당신이 원하는 :

SELECT col1, MAX(col2) as col2 
FROM Table1 
WHERE col3 = 'X' 
GROUP BY col1 
ORDER BY col2 
관련 문제