2013-11-28 109 views
1

我區的表:MySQL的JOIN + COUNT + WHERE +和

table region: 
id | title 

地區有許多廣告:

table advert: 
id | region_id | ... 

然後廣告有很多用途(多對多通過表adv_use):

table use: 
use | slug | ... 
---------------- 
1 | slug_1 | ... 
2 | slug_2 | ... 
.................. 



table adv_use: 
adv_id | use_id 

我想要選擇所有具有count(*)個廣告的區域,這些廣告使用了slug_1和slug_2。如果廣告對slug_1或slug_2(或兩者)沒有用處,則不得計算在內。 我現在擁有的一切:

SELECT COUNT(DISTINCT advert.id) as count 
FROM region 
JOIN advert ON region.id = advert.region_id 
JOIN adv_use ON advert.id = adv_use.adv_id 
JOIN use ON adv_use.use_id = use.id 
WHERE use.slug IN ('slug_1', 'slug_2') 
GROUP BY region.id 
HAVING COUNT(DISTINCT adv_use.use_id) = 2 

但它的工作不是我想要的。 SQLFiddle:http://sqlfiddle.com/#!2/5b4d4/1

感謝您的幫助和對英語不好的抱歉。

+0

你不能指望'advert.id'如果你也有'advert.id'在'GROUP BY'。 – Barmar

+0

如果我從GROUP BY中刪除它,它仍然是錯誤的。它是忽略HAVING語句並僅通過use.slug IN('slug_1','slug_2') – Phantaminuum

+0

SQLFiddle:http://sqlfiddle.com/#!2/5b4d4/1 – Phantaminuum

回答

0

您需要使用子查詢來選擇使用這兩種子彈的adv_id

SELECT COUNT(DISTINCT advert.id) as count, region.id as reg_id 
FROM region 
JOIN advert ON region.id = advert.region_id 
JOIN (SELECT adv_use.adv_id 
     FROM adv_use 
     JOIN tbl_use ON adv_use.use_id = tbl_use.id 
     WHERE tbl_use.slug IN ('slug1', 'slug2') 
     GROUP BY adv_use.adv_id 
     HAVING COUNT(DISTINCT adv_use.use_id) = 2) adv_use 
ON advert.id = adv_use.adv_id 
GROUP BY region.id 
; 

SQLFIDDLE

+0

謝謝,完美的作品! – Phantaminuum