MySQL GROUP BY优先

时间:2009-11-16 12:24:06

标签: mysql group-by

是否可以使用具有记录首选项的GROUP BY?

例如,我有大量的联系人数据,可能包含也可能不包含所有信息 - 在CSV意义上,如果看起来像这样:

Test User, Address1, Address2, test@test.com  
, , , test@test.com

如果我是GROUP BY电子邮件,我很乐意提取更相关的记录。

希望有道理吗?

此致, 克里斯

4 个答案:

答案 0 :(得分:2)

您可以使用聚合函数为每封电子邮件获取更“相关”的记录。
我认为这个查询会给你最好的结果:

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

答案 1 :(得分: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
        )

答案 2 :(得分:0)

GROUP BY SUBSTRING(字段,N);

答案 3 :(得分:0)

不确定您的意思,但在某些(大多数?)SQL方言中,您可以将GROUP BYCASE逻辑结合起来:

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

(就像我说的,我不确定它是否对MySql有效)。

编辑:如果这对MySql无效,你可以随时提取这段逻辑

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

进入视图并从该视图SELECTGROUP包含逻辑的列。

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