添加内部联接使查询显示重复
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,遇到了这一点。您可能应该添加表定义。 对我的问题有什么建议吗? 使用DISTINCT
。 SELECT 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
【讨论】:
以上是关于添加内部联接使查询显示重复的主要内容,如果未能解决你的问题,请参考以下文章