2012-07-25 2 views
1

Product 테이블 : 나는 이름으로 그룹화 된 모든 제품의 목록을 얻을 필요가 있고,MySQL의 GroupWise에 최대

id: int 
name: varchar(255) 
info: varchar(8000) 

일부 제품은 가장 함께 하나를 같은 이름이있는 경우 표시하려면 info 필드의 데이터를 선택해야합니다. 또 다른 요구 사항은 일관성입니다. 동일한 제품이 매번 표시되도록 보장해야합니다. 그러나 성과는 이것에 전혀 문제가되지 않습니다. 이 는 MySQL의에서 작업을하지만 결과를 보장하지 않는 것을

select * from (select * from product order by length(info) desc) as product group by name 

나의 이해 :

그래서 내가 지금까지 가지고 올 것 중에 최고는 이것이다.

더 좋은 방법이 있습니까?

업데이트 :

내가 찾는 것의 예. 데이터가

1, 'Product1', '12345' 
2, 'Product1', '123' 
3, 'Product2', '123456' 
4, 'Product2', '123456' 
5, 'Product2', '12' 

을 경우 예상되는 결과 중 하나를해야한다 :

1, 'Product1', '12345' 
3, 'Product2', '123456' 

또는

1, 'Product1', '12345' 
4, 'Product2', '123456' 

나는 상관하지 않는 한이 같은 결과의로 둘 중 하나 쿼리를 실행할 때마다

+0

:

select p.name, max(info) from product p join (select p.name, max(len(info)) as maxinfolen from product p group by p.name ) t on p.name = t.name and len(p.info) = t.maxinfolen group by p.name 

를 같은 ID마다 시간을 선택하려는 경우, 당신은 같은 생각을 사용할 수 있습니다 ? 제품 테이블에 모든 것을 포함시키지 않으시겠습니까? –

+0

쿼리를 실행할 때마다 동일한 결과를 얻는 것과 같은 일관성. 필자의 예제를 통해 MySQL은 어떤 제품이 group by로 선택 될지는 보장하지 않는다. 결과가 잠재적으로 쿼리를 실행할 때마다 변경 될 수 있음을 의미한다. – Leo

+0

"제품"을 말하지만 쿼리가 모든 제품을 반환합니다. 문제는 "정보"입니다. 가장 일관성있는 것을 얻었 으면 어떤 일관성이 필요합니까? –

답변

0

나는 당신이 가입 할 필요가 있다고 생각 : 최대 길이는 정보 반복되는 경우는, 중복을 반환합니다

select p.* 
from product p join 
    (select p.name, max(len(info)) as maxinfolen 
     from product p 
     group by p.name 
    ) t 
    on p.name = t.name and 
     len(p.info) = t.maxinfolen 

. 외부에 의해, 당신이 할 수있는 중복 그룹을 제거하려면 다음을 일관성 무엇을 의미합니까

select p.* 
from product p join 
    (select p.name, min(id) as minid 
     from product p join 
      (select p.name, max(len(info)) as maxinfolen 
      from product p 
      group by p.name 
      ) t 
      on p.name = t.name and 
       len(p.info) = t.maxinfolen 
     group by p.name 
    ) t 
    on p.name = t.name and 
     p.id = t.minid 
+0

은 그런 경우 일관성을 보장 할 필요가 있습니다. 같은 제품을 그룹별로 항상 선택해야합니다. 그래서 동일한 길이의 신제품이 추가되면, 이미 선택된 첫 번째 제품이 리턴되며, 새로운 제품은 리턴되지 않습니다. –

+0

나는 다른 테이블이나 이전 선택 사항을 등록하는 수단없이 도움을 줄 수있는 방법이 보이지 않습니다. 그렇지 않은 경우 위 쿼리가 요구 사항에 응답합니다. –

+0

은 실제로 일관성을 보장하지 않습니다. 두 제품의 이름이 동일하고 len (info)이 같으면 MySQL은 어떤 제품이 선택 될지를 보장하지 않습니다. – Leo

관련 문제