我喜欢这个数据库表:
表格 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
我有查询以获取每个类别的价格 min
、max
和 avg
:
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)
如何更正我的查询?
答案 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`