是否可以使用GROUP BY和记录偏好?MySQL GROUP BY优先
比如我有联系的数据一大堆,可能会或可能不会包含所有的信息 - 在一个CSV意义,如果可能是这样的:
Test User, Address1, Address2, [email protected]
, , , [email protected]
如果我是GROUP BY电子邮件,我会爱提取更相关的记录。
希望有道理吗?
此致, 克里斯
是否可以使用GROUP BY和记录偏好?MySQL GROUP BY优先
比如我有联系的数据一大堆,可能会或可能不会包含所有的信息 - 在一个CSV意义,如果可能是这样的:
Test User, Address1, Address2, [email protected]
, , , [email protected]
如果我是GROUP BY电子邮件,我会爱提取更相关的记录。
希望有道理吗?
此致, 克里斯
您可以使用聚合函数获取每个电子邮件的“相关”记录。
我觉得这个查询会得到你最好的结果:
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
GROUP BY SUBSTRING(字段,N);
不知道你的意思,但在一些(?大多数)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
对于每封电子邮件,该语句将选择设置了最高场纪录:
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
)
你是什么意思“更相关的记录”?另一行有相同的电子邮件?或另一列?要么? – Andomar 2009-11-16 12:32:53
嗨,假设这两行上面的数据库在哪里 - 我想拉出与联系信息,而不是与空字段的行。 – ChrisS 2009-11-16 12:44:32