#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;