【问题标题】:MySQL JOIN+COUNT+WHERE+ANDMySQL JOIN+COUNT+WHERE+AND
【发布时间】: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') 计算
  • +1 提出正确的问题。可能有点过于本地化,但至少它遵守了指南。
  • 我觉得很合适。区域 1 有广告 1,它使用 slug1 和 slug2。区域 2 有广告 2 和 3;广告 2 使用 slug1 和 slug2,广告 3 使用 slug2。所以这两个区域都在结果中。

标签: mysql join count


【解决方案1】:

您需要使用子查询来选择使用两个 slug 的 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

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多