SQL 获取产品类别的总销售量

时间:2021-04-07 06:59:55

标签: mysql sql

我喜欢这个数据库表:

表格 categories

id
title
description
status

表格 products

id
user_id
category_id
description
status

表格 product_varieties

id
variety_id
product_id
description
wholesale_price
retail_price
status
total

我有查询以获取每个类别的价格 minmaxavg

SELECT `categories`.`title`,
         min(product_varieties.wholesale_price) AS wholesalePriceMin,
         max(product_varieties.wholesale_price) AS wholesalePriceMax,
         avg(product_varieties.wholesale_price) AS wholesalePriceAvg,
         min(product_varieties.retail_price) AS retailPriceMin,
         max(product_varieties.retail_price) AS retailPriceMax,
         avg(product_varieties.retail_price) AS retailPriceAvg
FROM `products`
LEFT JOIN `categories`
    ON `categories`.`id` = `products`.`category_id`
LEFT JOIN `product_varieties`
    ON `product_varieties`.`product_id` = `products`.`id`
WHERE `products`.`id` IN (1,2,3,4)
GROUP BY  `products`.`category_id`

现在我需要通过编辑当前查询来获取每个类别的总用户(卖家)。

我是这样试的:

SELECT `categories`.`title`,
         min(product_varieties.wholesale_price) AS wholesalePriceMin,
         max(product_varieties.wholesale_price) AS wholesalePriceMax,
         avg(product_varieties.wholesale_price) AS wholesalePriceAvg,
         min(product_varieties.retail_price) AS retailPriceMin,
         max(product_varieties.retail_price) AS retailPriceMax,
         avg(product_varieties.retail_price) AS retailPriceAvg,
         
    (SELECT user_id,
         COUNT(*)
    FROM products
    GROUP BY  category_id) AS totalUsers
FROM `products`
LEFT JOIN `categories`
    ON `categories`.`id` = `products`.`category_id`
LEFT JOIN `product_varieties`
    ON `product_varieties`.`product_id` = `products`.`id`
WHERE `products`.`id` IN (1,2,3,4)
GROUP BY  `products`.`category_id`

但我的查询不起作用并返回错误消息:

SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)

如何更正我的查询?

2 个答案:

答案 0 :(得分:1)

您的子查询必须是相关的,而不是完整的。

SELECT `categories`.`title`,
         min(product_varieties.wholesale_price) AS wholesalePriceMin,
         max(product_varieties.wholesale_price) AS wholesalePriceMax,
         avg(product_varieties.wholesale_price) AS wholesalePriceAvg,
         min(product_varieties.retail_price) AS retailPriceMin,
         max(product_varieties.retail_price) AS retailPriceMax,
         avg(product_varieties.retail_price) AS retailPriceAvg,
         
    (SELECT COUNT(p.user_id)
    FROM products p
    WHERE p.user_id = `products`.user_id) AS totalUsers
FROM `products`
LEFT JOIN `categories`
    ON `categories`.`id` = `products`.`category_id`
LEFT JOIN `product_varieties`
    ON `product_varieties`.`product_id` = `products`.`id`
WHERE `products`.`id` IN (1,2,3,4)
GROUP BY  `products`.`category_id`

附注。也许,需要COUNT(DISTINCT p.user_id)...

答案 1 :(得分:1)

可以在主查询的选择列表中使用“相关子查询”,该查询必须只返回一个值,并且“相关”通过 where 子句发生,因为主查询中的一些数据用于定位子查询中想要的数据。

function check_odd_even($data){
    if($data % 2 == 0){
        $data = "Even";
    }
    else{
        $data = "Odd";
    }
    return $data;
}
if (check_odd_even($index) == 'Odd'){
//layout 1....
}else{
//layout 2....
}

但我怀疑这可以进一步简化:

SELECT
      `categories`.`title`
    , min(product_varieties.wholesale_price) AS wholesalePriceMin
    , max(product_varieties.wholesale_price) AS wholesalePriceMax
    , avg(product_varieties.wholesale_price) AS wholesalePriceAvg
    , min(product_varieties.retail_price) AS retailPriceMin
    , max(product_varieties.retail_price) AS retailPriceMax
    , avg(product_varieties.retail_price) AS retailPriceAvg
    , (
        SELECT COUNT(*)
        FROM products AS p
        WHERE p.category_id = `products`.`category_id`
        ) AS totalUsers
FROM `products`
LEFT JOIN `categories` ON `categories`.`id` = `products`.`category_id`
LEFT JOIN `product_varieties` ON `product_varieties`.`product_id` = `products`.`id`
WHERE `products`.`id` IN (1, 2, 3, 4)
GROUP BY `products`.`category_id`

或者,取决于数据:

SELECT
      `categories`.`title`
    , min(product_varieties.wholesale_price) AS wholesalePriceMin
    , max(product_varieties.wholesale_price) AS wholesalePriceMax
    , avg(product_varieties.wholesale_price) AS wholesalePriceAvg
    , min(product_varieties.retail_price) AS retailPriceMin
    , max(product_varieties.retail_price) AS retailPriceMax
    , avg(product_varieties.retail_price) AS retailPriceAvg
    , COUNT(products.user_id) AS totalUsers
FROM `products`
LEFT JOIN `categories` ON `categories`.`id` = `products`.`category_id`
LEFT JOIN `product_varieties` ON `product_varieties`.`product_id` = `products`.`id`
WHERE `products`.`id` IN (1, 2, 3, 4)
GROUP BY `products`.`category_id`