当GROUP BY不起作用时,如何将mysql区分为多个计数字段中的一个?

时间:2013-11-21 15:46:57

标签: mysql

我有一个包含此产品的产品,制造商和类别的数据库,以及有关制造商名称,产品以及这些产品是否有图像的信息。

但是在这个数据库中是具有不同ID的重复产品。只有我能辨认出来的是他们的名字。

现在,我想查询一下我想查看每个制造商和每个类别的产品在我的数据库中的数量,并计算带有图像的产品数量。

-----------------------------------------------------
| manufactor | category | products | productsImages |
|------------|----------|----------|----------------|
|   manu-1   |  cat-1   |    5     |       3        |
|------------|----------|----------|----------------|
|   manu-1   |  cat-2   |    15    |       8        |
|------------|----------|----------|----------------|
|   manu-2   |  cat-1   |    11    |       0        |
|------------|----------|----------|----------------|
|   manu-3   |  cat-2   |    5     |       4        |
|------------|----------|----------|----------------|
|   manu-3   |  cat-3   |    9     |       4        |
|------------|----------|----------|----------------|

我的方法如下:

SELECT m.`name` AS manufactor,
       pg.`name` AS category,
       COUNT(p.`name`) AS products,
       COUNT(pi.`idImage`) AS productsImages
FROM `product` AS p
LEFT JOIN `product_image` AS pi ON pi.`idProduct` = p.`id`
INNER JOIN `manufacturer` AS m ON m.`id` = p.`idManufacturer`
INNER JOIN `product_groupname` AS pg ON pg.`id` = p.`idProductGroup`
GROUP BY p.`idManufacturer`, p.`idProductGroup`
ORDER BY m.`name`, p.`idProductGroup`;

我无法按p.name进行分组,因为我会为每个产品获得一个结果行。 COUNT(DISTINCT(p.名称))也没有帮助。

那么我对子查询有什么建议吗?

2 个答案:

答案 0 :(得分:1)

请参阅有关问题的评论 - p.name上的不同是解决方案。

SELECT m.`name` AS manufactor,
       pg.`name` AS category,
       COUNT(DISTINCT(p.`name`)) AS products,
       COUNT(pi.`idImage`) AS productsImages
FROM `product` AS p
LEFT JOIN `product_image` AS pi ON pi.`idProduct` = p.`id`
INNER JOIN `manufacturer` AS m ON m.`id` = p.`idManufacturer`
INNER JOIN `product_groupname` AS pg ON pg.`id` = p.`idProductGroup`
GROUP BY p.`idManufacturer`, p.`idProductGroup`
ORDER BY m.`name`, p.`idProductGroup`;

答案 1 :(得分:1)

如果要计算pi.`idImage` IS NOT NULL所在的不同名称,可以使用以下内容:

SELECT m.`name` AS manufactor,
       pg.`name` AS category,
       COUNT(DISTINCT p.`name`) AS products,
       COUNT(DISTINCT CASE 
             WHEN pi.`idImage` IS NOT NULL THEN p.`name` 
             ELSE NULL 
       END) AS productsImages
FROM `product` AS p
LEFT JOIN `product_image` AS pi ON pi.`idProduct` = p.`id`
INNER JOIN `manufacturer` AS m ON m.`id` = p.`idManufacturer`
INNER JOIN `product_groupname` AS pg ON pg.`id` = p.`idProductGroup`
GROUP BY p.`idManufacturer`, p.`idProductGroup`
ORDER BY m.`name`, p.`idProductGroup`;