首页 > 解决方案 > MySQL HAVING 1 与子选择

问题描述

我试图找到一个只有一个 option_group 的产品,想象一组产品和 product_options 主要产品只有一组选项和一个或多个可以包含多个选项组的捆绑产品

Products:
ID, Name, Price
1, Jacket, 10.00
2, Jacket & Hat, 15.00
3, Jacket, Hat & Gloves, 20.00
4, Hat, 5.00

Options
ID, product_id, option_group, option_name, option_value, option_code
1, 1, 1, size, small, jacksm 
2, 1, 1, size, medium, jackme
3, 1, 1, size, large, jackla
4, 2, 1, size, small, jacksm
5, 2, 1, size, medium, jackme
6, 2, 1, size, large, jackla
7, 2, 2, size, small, hatsm
8, 2, 2, size, medium, hatmed

在上述示例数据中,产品 1 Jacket 和产品 2 Jacket & Hat 中都存在相同的夹克,并且产品 3 中也存在相同的夹克。即使购买了捆绑的夹克和帽子,我也需要使用选项代码找到夹克产品 1。

SELECT product_id, option_group FROM product_options WHERE product_id in(
SELECT DISTINCT(product_id) from products 
JOIN options OPTIONS products.product_id = product_options.product_id WHERE option_code = 'jacksm'
) 
group by option_group;

我可以获得所有 id,我可以看到我需要的一个 product_id 和一个选项组,但我无法过滤到它我尝试添加 HAVING 1 = count(option_group) 但它返回并为空集?

标签: mysql

解决方案


您必须GROUP BY product_id在 HAVING 子句中设置条件:

SELECT product_id, MAX(option_group) option_group 
FROM product_options 
GROUP BY product_id
HAVING COUNT(DISTINCT option_group) = 1

推荐阅读