2009-11-16 10 views
2

GROUP BY를 레코드에 대한 환경 설정과 함께 사용할 수 있습니까? 예를 들어MySQL GROUP BY 환경 설정

내가 또는 모든 정보를 포함하거나 포함하지 않을 수있다 연락처 데이터의 전체 무리가 - 다음과 같을 수 있다면 CSV의 의미를 :

Test User, Address1, Address2, [email protected] 
, , , [email protected] 

내가 이메일로 그룹에 있었다면, 나는 사랑 보다 관련성 높은 레코드를 추출합니다.

희망이 맞나요?

어차피, 크리스

+0

"관련성 높은 레코드"란 무엇을 의미합니까? 동일한 이메일을 가진 다른 행이 있습니까? 아니면 다른 컬럼? 또는? – Andomar

+0

안녕하세요, 데이터베이스의 위 두 행을 가정 해 봅시다. 빈 필드가있는 행 대신 연락처 정보가있는 행을 가져 오려고합니다. – ChrisS

답변

1

각 이메일에 대해 '관련성 높은'레코드를 얻으려면 집계 함수를 사용할 수 있습니다.

SELECT emailAddress, max(concat(fullName,',',address1,',',address2)) 
FROM table 
GROUP BY emailAddress 

그것은 각 이메일 주소에 대해 가장 부유 한 행을 리턴하지만 모든 데이터가 하나 개의 문자열 (쉼표로 구분) 이내에 반환됩니다 그래서 당신은 구문 분석해야합니다 :
나는이 쿼리는 당신에게 가장 좋은 결과를 얻을 것이라고 생각 어떻게 든.
성능이 더 문제가 없다 당신은 당신이 하나를 갈 수있는 별도의 필드에 설정 정상적인 결과를 얻을하려는 경우 :

각 이메일에 대한
SELECT table.emailAddress, fullName, address1, address2 
FROM 
table JOIN 
    (SELECT emailAddress, 
     max(concat(fullName,address1,address2)) as bestRowInOneString 
    FROM table 
    GROUP BY emailAddress 
    ) bestRowsSubQuery 
ON 
    concat(table.fullname,table.address1,table.address2) = bestRowsSubQuery.bestRowInOneString 
    AND table.emailAddress = bestRowsSubQuery.emailAddress 
0

SUBSTRING BY GROUP (필드 N);

0

확실하지 당신이 무슨 뜻인지,하지만 일부 (? 대부분의) SQL 언어에 당신은 CASE 논리 GROUP BY을 결합 할 수 있습니다 :

GROUP BY case when col1 = 'x' then col1 else col2 end 

(내가 말했듯이, 나는 그 MySQL의 유효 있는지 확실하지 않습니다).

편집 : 그 MySQL의 유효 아니라면, 예를 들어 논리를 포함하는 열을 보내고, 당신은 항상보기에 논리

GROUP BY case when col1 = 'x' then col1 else col2 end 

의이 비트를 추출 할 수 있으며, 해당 뷰에서 SELECT, GROUP

select * from 
(
    select .... 
    , (case ....) as logic_col 
    from ... 
) x 
group by logic_col 
1

,이 쿼리가 설정 한 대부분의 필드와 레코드를 선택합니다 :

SELECT * 
FROM (
     SELECT DISTINCT email 
     FROM mytable 
     ) mi 
JOIN mytable mo 
ON  mo.id = 
     (
     SELECT id 
     FROM mytable mf 
     WHERE mf.email = mi.email 
     ORDER BY 
       username IS NULL + address1 IS NULL + address2 IS NULL DESC 
     LIMIT 1 
     )