使用MySQL
因此,我正在尝试改进我编写的查询。我当前的查询有效,但是我觉得我可能会更有效率
从本质上讲,我有一个表格,其中列出了“谁与谁对话以及多少对话”。
记录如下所示:
电子邮件名称状态计数prod_ref
(我将在示例末尾发布示例集,并带有示例输出)
PK =电子邮件和姓名
名称是特定于运行此电子邮件的组织的内部电子邮件地址。 (即IE sue @ innatech成为sue)
我最初想要的是一个查询,该查询将返回具有每个电子邮件地址最高计数的记录。
我能想到的最好的方法是:
SELECT email, name
FROM email_tbl AS a INNER JOIN
(SELECT email, MAX(count) cnt
FROM email_tbl
GROUP BY email) AS b ON a.email = b.email AND a.count = r.cnt
这似乎相当优化。然后,我可以通过在子查询中添加HAVING子句来进一步过滤结果,以指定诸如SUM(count)> 20 ect之类的内容。
令人讨厌的部分是状态字段。 (我知道,有些数据复制问题破坏了正确的ER样式,但由于某些原因,我只允许使用一张表)。
状态字段描述是否应忽略特定电子邮件。从理论上讲,电子邮件的所有记录都应具有相同的字段,但是我想解释一下这不是真的情况。基本上,如果存在状态为“忽略”的记录,我想扔掉该记录上的电子邮件。
我可以想到的唯一方法是通过添加到末尾的另一个子查询
WHERE a.email NOT IN
(SELECT DISTINCT email
FROM email_tbl
WHERE status = 'ignore')
它行得通...但是我一直在市场上改进自己的工具,所以我想知道是否有更好的方法来实现这一目标。
附录A示例集
email_tbl
[email protected];phil;good;12
[email protected];sue;good;5
-----------------------
[email protected];phil;good;2
[email protected];sue;good;2
[email protected];fred;good;8
-----------------------
[email protected];phil;good;5
[email protected];sue;ignore;4
会回来
[email protected];phil
[email protected];fred
最佳答案
只需执行几项即席查询,因此您必须测试性能:
使用NOT EXISTS代替IN至少应该比您拥有的更快,因为它一旦找到匹配项就可以停止处理子查询。它是相关的,因此您必须进行测试。
SELECT
email,
name
FROM
Email_Tbl AS T1
INNER JOIN
(
SELECT email, MAX(count) cnt
FROM email_tbl
GROUP BY email
) AS SQ ON
SQ.email = T1.email AND
SQ.cnt = T1.count
WHERE
NOT EXISTS
(
SELECT *
FROM Email_Tbl T2
WHERE T2.email = T1.email
AND T2.status = 'Ignore'
)
SELECT
email,
name
FROM
Email_Tbl T1
LEFT OUTER JOIN Email_Tbl T2 ON
T2.email = T1.email AND
(
T2.count > T1.count OR
T2.status = 'Ignore'
)
WHERE
T2.email IS NULL
SELECT
email,
name
FROM
Email_Tbl T1
LEFT OUTER JOIN Email_Tbl T2 ON
T2.email = T1.email AND
T2.count > T1.count
LEFT OUTER JOIN Email_Tbl T3 ON
T3.email = T1.email AND
T3.status = 'Ignore'
WHERE
T2.email IS NULL OR
T3.email IS NULL
关于sql - SQL:基于聚合函数筛选组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3469827/