2016-06-09 18 views
1

讓我們假設我有以下查詢:MySQL的 - 改變或與

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

該查詢選擇每個ADID從廣告表,其中有至少一個以下三個設施(2,18 ,1)。 AdsAmenities表是我在那裏存儲AdsAmenities之間的關係的表。我怎麼能改變這個查詢,它應該只返回具有所有列舉的舒適度ID的AdId?

回答

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值uniq的,你可以跳過distinct部分。

+0

你能解釋一下你的答案之間的區別,以下你的答案是什麼?我的意思是,它看起來有效,我有興趣使用您提供的JOIN有什麼優勢呢?我將其標記爲正確的答案,因爲你的速度更快:) –

+2

@AdamBaranyai:1)我使用顯式的'join'符號而不是隱含的(你提供的),這是不贊成的(隱含的)。 2)在結果集中'AdsAmenities.amenities_AmenityId'不是uniq的情況下,我們的答案並不完全相同,即如果有一個「AdsAmenities.amenities_AmenityId」有三行(如(2,2,18)),則下面的查詢返回相應的'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