添加内部联接使查询显示重复

Posted

技术标签:

【中文标题】添加内部联接使查询显示重复【英文标题】:Adding an inner join makes query show duplicates 【发布时间】:2015-08-03 23:32:17 【问题描述】:

显示表格的子集

SELECT cont.ID, cont.UUID
FROM  `contract` cont
INNER JOIN geoPoint geo ON geo.cUUID = cont.c_UUID
WHERE geo.geotype =1
AND geo.g_UUID =  '$uuid'

添加一个额外的 gt

  SELECT cont.ID, cont.UUID
    FROM  `contract` cont
    INNER JOIN geoPoint geo ON geo.cUUID = cont.c_UUID
    INNER JOIN tier gt ON gt.UUID = cont.price_tier
    WHERE geo.geotype =1
    AND geo.g_UUID =  '$uuid' AND gt.type = 0

现在它显示了数千个重复项

【问题讨论】:

这看起来有点不靠谱 "gt.UUID = cont.price_tier" 从设计的角度来看似乎很奇怪,你似乎有大多数这样的字段后缀为 UUID,遇到了这一点。您可能应该添加表定义。 对我的问题有什么建议吗? 使用DISTINCTSELECT DISTINCT cont.ID ... 样本数据和预期结果(最好在 sqlfiddle 中)会有所帮助 【参考方案1】:

您很可能需要更好地解释您正在寻找什么以及您的数据与您的关系如何才能得到一个非猜测的答案,但这是我的疯狂猜测......

SELECT cont.ID, cont.UUID
FROM  `contract` cont
WHERE cont.c_UUID IN (
    SELECT geo.cUUID 
    FROM geoPoint AS geo 
    WHERE geo.geotype =1
    AND geo.g_UUID =  '$uuid'
)
AND cont.price_tier IN (
    SELECT gt.UUID 
    FROM tier AS gt
    WHERE gt.type = 0 
)
;

【讨论】:

【参考方案2】:

如果您的分层表每个 UUID 有多个值,则需要使用 EXISTS 子句(这很奇怪)

SELECT cont.ID, cont.UUID
FROM  `contract` cont
INNER JOIN geoPoint geo ON geo.cUUID = cont.c_UUID
WHERE geo.geotype =1
AND geo.g_UUID =  '$uuid' AND gt.type = 0
AND EXISTS (SELECT * FROM tier gt WHERE gt.UUID = cont.price_tier)

【讨论】:

【参考方案3】:

对返回的记录多于预期的JOIN 进行故障排除的一种简单方法是查看数据以了解其原因。一次从一张表中获取DISTINCT * 将显示原因,在这种情况下,很明显是tier 表,因为这是导致麻烦的添加:

  SELECT DISTINCT gt.*
    FROM  `contract` cont
    INNER JOIN geoPoint geo ON geo.cUUID = cont.c_UUID
    INNER JOIN tier gt ON gt.UUID = cont.price_tier
    WHERE geo.geotype =1
    AND geo.g_UUID =  '$uuid' AND gt.type = 0

观察具有多行的gt.UUID 的值,然后您将能够确定最佳的行动方案...也许每一侧的许多记录都有空白值,也许您需要另一个字段添加到您的JOIN 标准...无论如何,观察数据将帮助您确定问题所在,因为正如您所说,您的查询看起来不错。

【讨论】:

【参考方案4】:
SELECT DISTINCT  cont.ID, cont.UUID

FROM  `contract` cont

INNER JOIN geoPoint geo ON geo.cUUID = cont.c_UUID

INNER JOIN tier gt ON gt.UUID = cont.price_tier

WHERE geo.geotype =1

AND geo.g_UUID =  '$uuid' AND gt.type = 0

【讨论】:

以上是关于添加内部联接使查询显示重复的主要内容,如果未能解决你的问题,请参考以下文章

具有内部联接的重复列

如何使用内部连接查询(Postgres)防止重复

MySQL:内部联接与 Where [重复]

将多条记录添加到数据库时,内部联接的 LINQ 查询不起作用

sql中如何使一列中的多个重复数据只显示第一条

sql中如何使一列中的多个重复数据只显示一次, 求大神指导,使得图中的班简名重复的只显示一次。