2013-09-25 35 views
0

我有四個表,假設他們每個只有一個id作爲列。有多個表的聯結表上的MySQL SELECT查詢

  • listings
  • feature
  • location
  • l_f_location與FKS上listingIdfeatureId結合表,locationId

我嘗試查詢l_f_location表一組給定的locationIds (邏輯AND匹配)並且希望成爲結果僅列出與所有locationIds匹配的列表,例如(7和9和10)。

l_f_location看起來像

listingId featureId locationId 
10  5   7 
10  7   7 
10  8   9 
11  4   7 
11  8   9 
11  9   10 
11  12  14 

的目標是隻listingId 11在這種情況下檢索 - 匹配該組locationIds 7,9和10

我嘗試下面的查詢

SELECT id, COUNT(*) as num FROM l_f_locations WHERE locationId IN (7, 9, 10) GROUP by listingId, locationId HAVING num = 3

但是這給出錯誤的計數值作爲分組ki cks in。

類似的查詢在更簡單的聯結表上完美工作,例如,只有l_location與例如「SELECT id, COUNT(*) as num FROM l_location WHERE locationId IN (7, 9, 10) GROUP by listingId HAVING num = 3」。

RGDS, P.

+0

在第一個查詢你爲什麼包括'locationId'的'GROUP BY'子句中? –

+0

我通過listingId和locationId進行分組,以將結果減少到我想按每個listingId計數的結果。 – PMiller

+0

不,我正在尋找一個有7,8,9的listingId。它可能有其他的,但這在這個查詢中很好。 – PMiller

回答

3

我假設同一listingIdlocationId可以有多個featureId S'否則它會更容易一些。

如果是這樣的話:

SELECT listingId, COUNT(*) as num 
FROM 
(SELECT DISTINCT listingId, locationId 
FROM l_f_locations 
WHERE locationId IN (7, 9, 10)) AS sub 
GROUP by listingId, HAVING num = 3 
+0

是的,你假設正確。內選擇需要是別名,所以我tworks像 'SELECT listingId,COUNT(*)爲num FROM (SELECT DISTINCT listingId,locationId FROM l_f_locations WHERE locationId IN(7,9,10))爲Foo GROUP by listingId,HAVING num = 3' – PMiller

+0

太好了。讓我知道它是否有效。如果不是,創建一個演示問題的SQL小提琴可能是最簡單的。 – Hbcdev

+0

我現在正在測試,目前看起來不錯。將做更多的測試,然後接受你的答案。非常感謝! – PMiller