使用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/

10-11 04:08