2009-11-16 135 views
2

是否可以使用GROUP BY和記錄偏好?MySQL GROUP BY優先

比如我有聯繫的數據一大堆,可能會或可能不會包含所有的信息 - 在一個CSV意義,如果可能是這樣的:

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

如果我是GROUP BY電子郵件,我會愛提取更相關的記錄。

希望有道理嗎?

此致, 克里斯

+0

你是什麼意思「更相關的記錄」?另一行有相同的電子郵件?或另一列?要麼? – Andomar 2009-11-16 12:32:53

+0

嗨,假設這兩行上面的數據庫在哪裏 - 我想拉出與聯繫信息,而不是與空字段的行。 – ChrisS 2009-11-16 12:44:32

回答

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

GROUP BY SUBSTRING(字段,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 
     )