【问题标题】:SQL query which return counted results from many tables从许多表返回计数结果的 SQL 查询
【发布时间】:2017-08-16 19:24:57
【问题描述】:

我有两张表“商店”和“产品”。商店有很多产品,产品属于一个商店。而且产品属于唯一的一类。我有 3 个类别的 ID(例如 1、2、3)。我怎样才能让所有商店拥有属于所有 3 个类别的产品?

我试过了

SELECT distinct s.*
from shops s
left join products p on p.shop_id = s.id
where p.category_id in (1,2,3)

但这会返回商店的产品属于类别 1 OR 2 OR 3 但我想要属于所有 3 个类别的产品,例如 1 AND 2 AND 3,所以每个商店必须至少有 3 个产品

【问题讨论】:

  • 外部加入一个你不选择列的表真的没有意义
  • 碰巧这是一个内部连接

标签: mysql sql join count where-in


【解决方案1】:

您可以检查具有 count(distinct p.category_id) = 3 的 s.id

SELECT  s.id 
from shops s
inner join products p on p.shop_id = s.id
where p.category_id in (1,2,3)
group by s.id
having count(distinct p.category_id) = 3

【讨论】:

  • 你救了我的命 :)
  • 它仍然是一个内部连接
【解决方案2】:
SELECT s.*
  from shops s
  join products p 
    on p.shop_id = s.id
 where p.category_id in (1,2,3)
 Group 
    by s.id
Having count(distinct p.category_id) = 3

或者类似的东西

【讨论】:

    【解决方案3】:

    试试这个?

    SELECT DISTINCT A.ID FROM SHOPS A, PRODUCTS B
    WHERE A.ID = B.SHOP_ID AND EXISTS (SELECT COUNT(1) FROM PRODUCTS C, PRODUCTS D, PRODUCTS E WHERE B.ID = C.ID AND C.ID = D.ID AND D.ID = E.ID AND C.CATEGORY_ID = 1 AND D.CATEGORY_ID = 2 AND E.CATEGORY_ID = 3) 
    

    我的 T-SQL 生锈了,这假设我得到了正确的关系,例如 Shops 1 - M 产品,并且我不确定 Category 是否是实体,但 Category 1 - M 产品。此外,为了将来的工作,我发现当您的实体名称为单数名词时它会有所帮助,但这只是我的偏好。祝你好运。

    【讨论】:

      【解决方案4】:

      使用 group by 将由每个商店返回

      SELECT distinct s.*
      from shops s
      left join products p on p.shop_id = s.id
      where p.category_id in (1,2,3)
      group by s.id
      having count(distinct p.category_id) = 3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 1970-01-01
        • 2018-12-29
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        相关资源
        最近更新 更多