Почему «IN» в MySQL неправильно фильтрует данные?

#mysql #select

#mysql #выберите

Вопрос:

Я использую следующий запрос для получения идентификаторов регионов для заданных идентификаторов списка и идентификатора пользователя. Но мой результат включает в себя идентификаторы списка, которые я не ожидал, но все равно принадлежит пользователю.

 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, который я не запрашивал в своем запросе?

Комментарии:

1. Вы получаете это, потому что оно удовлетворяет условиям, которые вы передали в запрос. Кроме того, вам не нужен IN и подзапрос, WHERE LIST_REGION_LISTING_ID = @ListingID достаточно простого.

2. Потому что вы запрашиваете все строки, которые соответствуют LIST_REGION_REGION_ID и, вероятно, их несколько. Вам нужно будет точно объяснить, что вы хотите получить в качестве результата

3. Я специально спрашиваю «ВЫБЕРИТЕ LIST_REGION_REGION_ID ИЗ listing_region ГДЕ LIST_REGION_LISTING_ID = @ListingID». Итак, почему подзапрос приводит к дополнительному ListingID ?

Ответ №1:

Вы получаете LIST_REGION_LISTING_ID 58, потому что в подзапросе вы получаете все LIST_REGION_REGION_ID, которые имеют LIST_REGION_LISTING_ID = 71. В ваших результатах вы можете видеть, что вы получаете номера LIST_REGION_REGION_ID 11 и 12.

Итак, ваше предложение WHERE выглядит следующим образом

 WHERE LIST_REGION_REGION_ID IN (11,12) 
  

и это включает в себя строку с LIST_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;