我试图像你在下面看到的那样加入。我只想要在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
答案 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关联,反之亦然)或者您需要添加一个特定的附加连接条件,以防止不应该加入,加入的数据。
希望这会有所帮助。