Mysql 添加内部联接会使查询显示重复项
显示表的子集Mysql 添加内部联接会使查询显示重复项,mysql,sql,mysqli,Mysql,Sql,Mysqli,显示表的子集 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 g
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
现在它显示了数千个重复的项目很可能您需要更好地解释您正在寻找的内容以及数据之间的关系,以便获得非猜测性的答案,但这里是我的猜测
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
)
;
若对每个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)
对返回的记录比预期多的联接进行故障排除的一种简单方法是查看数据,看看是什么导致了它。每次从一个表中提取DISTINCT*将向您显示原因,在这种情况下,似乎很明显是分层表,因为这是导致问题的添加:
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的值,然后您将能够确定最佳的操作过程。。。可能有空白值连接到每一侧的多个记录,可能还有另一个字段需要添加到连接条件中。。。不管怎样,观察数据将有助于确定问题所在,因为正如您所说,您的查询看起来很好 这看起来有点不确定gt.UUID=cont.price\u tierJust从设计的角度来看似乎很奇怪,因为大多数这样的字段都带有UUID后缀。您可能应该添加表定义。对我的问题有什么建议吗?请使用DISTINCT。选择DISTINCT cont.ID…样本数据和理想的SQLFIDLE中的预期结果将有所帮助
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