【发布时间】:2013-11-28 09:58:41
【问题描述】:
我有地区表:
table region:
id | title
区域有很多广告:
table advert:
id | region_id | ...
那么advert有很多用途(many-many通过表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
感谢您的帮助,抱歉英语不好。
【问题讨论】:
-
如果
GROUP BY中还有advert.id,则不能算advert.id。 -
如果我从 GROUP BY 中删除它,它仍然会出错。它忽略 HAVING 语句,仅按 use.slug IN ('slug_1', 'slug_2') 计算
-
SQLFiddle: sqlfiddle.com/#!2/5b4d4/1
-
+1 提出正确的问题。可能有点过于本地化,但至少它遵守了指南。
-
我觉得很合适。区域 1 有广告 1,它使用 slug1 和 slug2。区域 2 有广告 2 和 3;广告 2 使用 slug1 和 slug2,广告 3 使用 slug2。所以这两个区域都在结果中。