2016-06-09 2 views
1

Давайте предполагать, у меня есть следующий запрос:MySQL - изменить или И

SELECT Ads.AdId 
    FROM Ads 
    , AdsAmenities 
WHERE AdsAmenities.amenities_AmenityId IN (2, 18, 1) 
    AND Ads.AdId = AdsAmenities.ads_AdId 

Этот запрос выбирает каждый Адид из таблицы объявления, которая имеет по крайней мере один из следующих трех удобств (2, 18 , 1). Таблица AdsAmenities такова, где я сохраняю связь между Ads и Amenities. Как я могу изменить этот запрос, чтобы он возвращал только AdId, у которых есть все перечисленные amenity idids?

ответ

5

Вы можете попробовать с having:

SELECT Ads.AdId 
FROM Ads 
JOIN AdsAmenities ON Ads.AdId = AdsAmenities.ads_AdId 
WHERE AdsAmenities.amenities_AmenityId IN (2, 18, 1) 
GROUP BY Ads.AdId 
HAVING COUNT(distinct AdsAmenities.amenities_AmenityId) = 3 

В случае AdsAmenities.amenities_AmenityId значений являются уником, вы можете пропустить distinct части.

+0

могли бы вы объяснить, в чем разница между вашим ответом, и ответ ниже вашего? Я имею в виду, что это работает в обоих направлениях, как я вижу, и мне интересно, что использование JOIN, которое вы предоставили, имеет какие-то преимущества вообще? Я отмечаю это как правильный ответ, потому что вы были быстрее :) –

+2

@AdamBaranyai: 1) Я использую явную «join» вместо вместо неявного (который вы предоставили), который устарел (неявный). 2) Наши ответы не идентичны в случае, если «AdsAmenities.amments_AmenityId» в результирующем наборе не является uniq, т. Е. Если есть три строки, такие как (2,2,18) для одного «AdsAmenities.amments_AmenityId», приведенный ниже запрос соответствующий 'Ads.AdId', а мой запрос - нет. – potashin

1

Я думаю, вам нужно HAVING COUNT(...) пункт здесь:

SELECT Ads.AdId FROM Ads, AdsAmenities 
    WHERE AdsAmenities.amenities_AmenityId IN (2, 18, 1) AND Ads.AdId = AdsAmenities.ads_AdId 
    GROUP BY Ads.AdId 
HAVING COUNT(AdsAmenities.amenities_AmenityId) >= 3