Mysql SQL-从具有公共字段的组中获取不同的记录
我有一张桌子:供应商\产品Mysql SQL-从具有公共字段的组中获取不同的记录,mysql,sql,Mysql,Sql,我有一张桌子:供应商\产品 Product , Supplier, Status Sugar , N_Supp, MAIN Sugar , S_Supp, SUB Sugar , E_Supp, MAIN Water , N_Supp, SUB Water , S_Supp, SUB Water , W_Supp, SUB Milk , S_Supp, MAIN Milk , N_Supp, MAIN Cream , N_S
Product , Supplier, Status
Sugar , N_Supp, MAIN
Sugar , S_Supp, SUB
Sugar , E_Supp, MAIN
Water , N_Supp, SUB
Water , S_Supp, SUB
Water , W_Supp, SUB
Milk , S_Supp, MAIN
Milk , N_Supp, MAIN
Cream , N_Supp, SUB
Cream , E_Supp, SUB
Coffee , S_Supp, MAIN
Coffee , W_Supp, SUB
Coffee , N_Supp, SUB
我必须让所有产品的状态只有“SUB”。
我用了这个密码。但我无法找出我的查询的问题,它的结果不正确
SELECT DISTINCT
s.product
FROM supplier_product s
WHERE EXISTS (SELECT
*
FROM supplier_product
WHERE supplier_product.product = s.product
AND supplier_product.status = 'SUB')
其结果应为:
Product
Water
Cream
如果您遇到此问题或任何链接/建议,请提供帮助。我很高兴知道这件事。谢谢。使用聚合最容易做到这一点:
select sp.product
from supplier_product sp
group by sp.product
having min(sp.status) = max(sp.status) and -- the statuses are all the same
min(sp.status) = 'SUB'; -- the value is 'SUB'
使用聚合最容易做到这一点:
select sp.product
from supplier_product sp
group by sp.product
having min(sp.status) = max(sp.status) and -- the statuses are all the same
min(sp.status) = 'SUB'; -- the value is 'SUB'
您可以使用
HAVING
和GROUP BY
:
SELECT product
FROM supplier_product
GROUP BY product
HAVING
SUM(CASE WHEN status = 'SUB' THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN status <> 'SUB' THEN 1 ELSE 0 END) = 0
选择产品
来自供应商的产品
按产品分组
有
总和(状态为'SUB'时为1,否则为0结束)>0
和和(状态为“SUB”时为1,否则为0结束)=0
您可以使用
have
和GROUP BY
:
SELECT product
FROM supplier_product
GROUP BY product
HAVING
SUM(CASE WHEN status = 'SUB' THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN status <> 'SUB' THEN 1 ELSE 0 END) = 0
选择产品
来自供应商的产品
按产品分组
有
总和(状态为'SUB'时为1,否则为0结束)>0
和和(状态为“SUB”时为1,否则为0结束)=0
谢谢@Felix Pamittan,它正在工作。也感谢您的演示:谢谢@Felix Pamittan,它正在工作。也感谢您的演示:D