【问题标题】:MySQL Join 3 Tables with Count, Group & Where/Having ClauseMySQL 使用 Count、Group 和 Where/Having 子句加入 3 个表
【发布时间】:2017-07-21 16:02:55
【问题描述】:

我有 3 张桌子

TABLE ii_ProductCategory
-------------------
id    title  

TABLE ii_Product2Category
-------------------
categoryId    productId

TABLE ii_Product
----------------
id    minPrice

我想查找所有类别要么根本不包含在 ii_Product2Category 中,要么只链接到 minPrice IS NULL 的产品。

这是我的尝试。我收到 GROUP BY 错误。

SELECT COUNT(DISTINCT p2c.`categoryId`) as "ProdCount",  
    cat.`id`,
    cat.`title`,
    prod.`minPrice`
FROM `ii_ProductCategory` cat  
LEFT JOIN `ii_Product2Category` p2c 
    ON p2c.`categoryId` = cat.`id`
LEFT JOIN `ii_Product` prod
    ON p2c.`productId` = prod.`id`
WHERE prod.`minPrice` IS NULL
    AND COUNT(DISTINCT p2c.`categoryId`) = 0
GROUP BY cat.`id`

我尝试将 prod.minPrice IS NULL 移动到加入的 HAVING 中,但这也不起作用。我还希望能够删除AND COUNT(DISTINCT p2c.categoryId) = 0 并按 ProdCount 排序,这样我就可以查看每个产品的总数,无论它们是否为空。

【问题讨论】:

  • 将“AND”更改为“HAVING”并将该行移至最底部

标签: mysql group-by left-join


【解决方案1】:

不对非聚合列进行分组是没有意义的。

SELECT COUNT(DISTINCT p2c.`categoryId`) as "ProdCount",  
    cat.`id`,
    cat.`title`,
    prod.`minPrice`
FROM `ii_ProductCategory` cat  
LEFT JOIN `ii_Product2Category` p2c 
    ON p2c.`categoryId` = cat.`id`
LEFT JOIN `ii_Product` prod
    ON p2c.`productId` = prod.`id`
WHERE prod.`minPrice` IS NOT NULL
GROUP BY cat.`id`, cat.`title`, prod.`minPrice`
HAVING COUNT(DISTINCT p2c.`categoryId`) = 0

【讨论】:

  • 我只想查看我的类别列表。 GROUP BY cat.id, cat.title, prod.minPrice 返回每​​个类别标题的重复项。 GROUP BY cat.id 是我需要的。
  • 查看我的更新。我需要知道哪些类别只有 minPrice IS NULL 的产品或根本没有产品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多