为什么mySQL中的“IN”不能正确过滤数据?

为什么mySQL中的“IN”不能正确过滤数据?,mysql,select,Mysql,Select,我使用以下查询获取给定listingID和UserID的RegionID。但是我的结果包括了我没有预料到但仍然属于用户的ListingID SET @ListingID = 71; SET @UserID = 160; SELECT LIST_REGION_LISTING_ID, LIST_REGION_REGION_ID, REGION_NICK_NAME FROM listing_region INNER JOIN region ON REGION_ID = LIST_REGION_R

我使用以下查询获取给定listingID和UserID的RegionID。但是我的结果包括了我没有预料到但仍然属于用户的ListingID

SET @ListingID = 71;
SET @UserID = 160;

SELECT 
LIST_REGION_LISTING_ID,
LIST_REGION_REGION_ID,
REGION_NICK_NAME
FROM 
listing_region
INNER JOIN region ON REGION_ID = LIST_REGION_REGION_ID AND REGION_USER_ID = @UserID
WHERE LIST_REGION_REGION_ID IN (SELECT LIST_REGION_REGION_ID FROM listing_region WHERE LIST_REGION_LISTING_ID = @ListingID);
结果:


为什么我会得到查询中没有请求的ListingID 58?

您会得到列表\区域\列表\ ID 58,因为在子查询中,您会得到列表\区域\区域\列表\ ID=71的所有列表\区域\ ID。在您的结果中,您可以看到tou get LIST_REGION_REGION_ID编号11和12

您的WHERE子句如下所示

WHERE LIST_REGION_REGION_ID IN (11,12) 
这包括列表为_REGION _LISTING _ID=58的行

您可以在不使用子查询的情况下执行查询:

SET @ListingID = 71;
SET @UserID = 160;

SELECT 
    LIST_REGION_LISTING_ID,
    LIST_REGION_REGION_ID,
    REGION_NICK_NAME
FROM 
    listing_region
INNER JOIN region ON REGION_ID = LIST_REGION_REGION_ID AND REGION_USER_ID = @UserID
WHERE  listing_region.LIST_REGION_LISTING_ID = @ListingID;

您得到它是因为它满足了您传递给查询的条件。此外,您不需要IN和子查询,简单的WHERE LIST\u REGION\u LISTING\u ID=@ListingID就足够了。因为您要求的是与LIST\u REGION\u REGION\u ID匹配的所有行,并且可能有多行。您需要准确地解释您想要得到的结果,我特别要求您从列表区域中选择列表区域ID,其中列表区域ID=@ListingID。那么为什么子查询会产生额外的ListingID呢?