2012-06-13 2 views
2
아래

나는 내가 사용하고분 (열) 나에게 다른 컬럼의 정확한 데이터를

+++++++++++++++++++++++++++ 
id + myDate  + name 
+++++++++++++++++++++++++++ 
'A'+ '2012-06-05' + 'baz' 
'A'+ '2012-06-04' + 'bar' 
'B'+ '2012-06-05' + 'foo' 
'C'+ '2012-06-05' + 'bla' 
'C'+ '2012-06-04' + 'blah' 
'C'+ '2012-06-06' + 'bleh' 
+++++++++++++++++++++++++++ 

쿼리

SELECT id, min(myDate) as Date, name 
FROM myTable 
GROUP BY id; 

나는 다음과 같이 출력을 얻고있다가 무엇을 반환하지 않습니다

+++++++++++++++++++++++++++ 
id + myDate  + name 
+++++++++++++++++++++++++++ 
'A'+ '2012-06-04' + 'baz' 
'B'+ '2012-06-05' + 'foo' 
'C'+ '2012-06-04' + 'bla' 
+++++++++++++++++++++++++++ 

제 질문은 내게 정확한 질문을 줄 때입니다. 열 name의 데이터가 바즈 대신 날짜 2012-06-04에 대한 name로 오는 이유 소리지르는, 입니다.

Demo 데이터를 테스트합니다. DevArt에 의해 지적 된 바와 같이

+4

그룹화에 사용되지 않는 추가 필드를 선택하려면 다른 쿼리를 사용해야합니다. http://stackoverflow.com/questions/10999522/how-to-get-the-latest-record-in -each-group-using-group-by/10999689 # 10999689 – Devart

+0

@dystroy 물론 대답 할 수 있습니다 ;-) 방금 예제에 대한 링크를 제공했습니다. – Devart

+0

@Devart : 솔루션을 알고 있지만 내 질문은 왜 min()이 원하는 결과를 제공하지 않는지입니다 ?? 왜 다른 쿼리를 사용해야합니까? –

답변

5

당신은 그것으로 이동 이름의

  1. 아이디

    ,
  2. 해당 ID에 대해 가장 낮은 날짜,
  3. 어떤을 잡아.

기타 (정상적인) 데이터베이스는이 쿼리를 허용하지 않습니다. 그들은 이름에 대해 집계 함수를 사용하도록하거나 에을 추가하도록 강요합니다. 대신 MySQL은 무작위 값을 선택합니다. 문제가 있습니다.

select 
    t.id, 
    t.mydate, 
    t.name 
from 
    myTable t 
where 
    t.mydate = 
    (select 
     min(td.mydate) 
    from 
     myTable td 
    where 
     td.id = t.id) 

또는 :

는이 문제를 해결하려면 쿼리가 두드러 더 복잡해질 것이다

select 
    t.id, 
    t.mydate as date, 
    t.name 
from 
    myTable t 
    inner join 
    (select 
     td.id 
     min(td.mydate) as date 
    from 
     myTable td 
    group by 
     td.id) tx on tx.id = t.id and tx.date = t.mydate 
+0

다음은 GROUP BY 절을 사용할 때 올바른 ID를 일치시키는 더 간단하고 빠른 방법입니다. 논리는 매우 간단합니다. 첫 번째로 오는 행에서 다른 열을 선택하여 그룹화하십시오. – Ali

1

당신은 다른 쿼리를 사용해야합니다 : 이름 컬럼에 대한 제약 조건을 지정하지

SELECT m.* from myTable m join 
(select id, min(myDate) md from myTable group by id) mm 
on m.id=mm.id and m.myDate=md 

기존 쿼리, 그건 당신이 결과를 얻지 않는 이유입니다 너는 기대하고 있었다. Group bymin과 같은 함수를 사용하여 값을 취할 수있는 집합을 만들거나 수행 한대로 지정하지 않으면 무작위로 만듭니다.

+0

나는 해결책을 안다. 그러나 나의 질문은 분()이 나에게 원하는 결과를주지 못하는 이유인가? 왜 다른 쿼리를 사용해야합니까? –

+1

min **은 ** 지정된 열 (myDate)에서 올바른 분을 제공합니다. 이름 열에 대해 원하는 것을 지정하지 않았습니다. –

+0

"다른 열에 대해 원하는 것을 지정하지 않았습니다." 쿼리의 이름 열은 무엇입니까 ??? –

1

를 특정 질문에 대해 유 할 필요는 연결된에 MIN 함수를 적용입니다 필드 : 서버 측 스크립트에

SELECT id, min(CONCAT(myDate,' ++ ',name)) as date_name 
FROM myTable 
GROUP BY id; 

이를 처리


GROPU BY를 (를) 사용하고 있습니다. 결과의 각 행은 그룹 값을 나타냅니다. 그 중 하나의 값은 그룹 이름 (사용자가 그룹화 한 필드의 값)입니다. 나머지는 해당 그룹 내에서 임의의 값입니다.예를 들어
다음 표 :

F1 | F2 
1   aa 
1   bb 
1   cc 
2   gg 
2   hh 

유 F1 그룹화됩니다 : SELECT F1,F2 from T GROUP BY F1 당신은 두 행 얻을 것이다 : u는 결정 결과 집합을 원하는 경우

1 and one value from (aa,bb,cc) 
2 and one value from (gg,hh) 

을, 당신은 말할 필요 어떤 알고리즘을 그룹에 적용 할 것인가? 예를 들어 몇 가지 :

  1. MIN
  2. MAX
  3. COUNT
  4. SUM

등 등 사용자의 경우

, U는 name 필드에 결정적 algorithem을 적용하지 않았다 그래서 집합에서 "임의"결과를 얻습니다.

관련 문제