MySQL JOIN忽略了结果中的COUNT

时间:2014-05-07 14:26:27

标签: mysql

我试图像你在下面看到的那样加入。我只想要在property_res表中至少有X个电子邮件地址的记录。当我将acount值从10更改为20时,例如返回的结果保持在949条记录。这应该会大幅减少,因为应该有很多匹配,其中r.EmailAddress被发现20次。在varchar数据类型上使用COUNT是否有限制?实现这一目标的最佳方法是什么?

SELECT 
    r.FirstName AS ag_fname,
    r.LastName AS ag_lname,     
    r.EmailAddress AS ag_email, 
    COUNT(r.EmailAddress) AS `acount`
    FROM property_res e
    LEFT JOIN ActiveAgent_Matrix r 
    ON e.ListAgentMLSID=r.MemberNumber
    WHERE e.ListPrice >= 50000
    GROUP BY r.EmailAddress
    HAVING acount >=20

数据的示例输出显示了帐户的奇怪值,因为我认为这是电子邮件地址的计数,但它们都是相同的?

ag_fname | ag_lname | ag_email      | acount
    Jane |     Doe1 | jdoe1@doe.com | 3390
    Jane |     Doe3 | jdoe3@doe.com | 3390
    Jane |     Doe4 | jdoe4@doe.com | 3390
    Jane |     Doe5 | jdoe5@doe.com | 3390

1 个答案:

答案 0 :(得分:1)

正在发生的事情是您的连接条件不够具体(或者实际上多个电子邮件可以与相同的ID关联,反之亦然,在这种情况下,GROUP BY不够具体)。我怀疑它是前者,你的结果集正在爆炸。不是笛卡尔式的加入,但类似。

尝试使用以下两个查询进行问题排查:

SELECT 
    r.EmailAddress,
    COUNT(*)
    FROM property_res e
    LEFT JOIN ActiveAgent_Matrix r 
    ON e.ListAgentMLSID=r.MemberNumber
    GROUP BY r.EmailAddress
    HAVING COUNT(*) > 1;

SELECT 
    e.ListAgentMLSID,
    COUNT(*)
    FROM property_res e
    LEFT JOIN ActiveAgent_Matrix r 
    ON e.ListAgentMLSID=r.MemberNumber
    GROUP BY e.ListAgentMLSID
    HAVING COUNT(*) > 1;

这些结果集中的一个(或两个)将为非空。这很重要,因为它意味着这个连接条件:ON e.ListAgentMLSID = r.MemberNumber不够具体。每个ListAgentMLSID有多个电子邮件,或者每个电子邮件地址有多个ListAgentMLSID ...或两者都有。

为了解决这个问题,我首先尝试确定“每个Y的多个X”的位置。上面的查询实际上可以帮助您做到这一点。第一个将识别与多个ID相关联的电子邮件。第二个将帮助您识别与多个电子邮件关联的ID。您需要问自己的问题是,如果多个电子邮件与任何给定的ID相关联?或者应该将多个ID与任何给定的电子邮件相关联?如果允许,请更改GROUP BY。如果不是,请更改您的加入条件。

它可能就像加入id和电子邮件一样简单....但如果不是,那么你也需要通过电子邮件进行分组(如上面评论中所建议的......如果确实如此应该允许多个电子邮件与id关联,反之亦然)或者您需要添加一个特定的附加连接条件,以防止不应该加入,加入的数据。

希望这会有所帮助。