2016-05-28 54 views
0

我的表:juicesjuice_ingredientsingredients查询返回多个相同的行而不是一个

juices表具有属性:

  • 条码

juice_ingredients表具有属性:

  • juice_id
  • ingredient_id

而且ingredients表有

  • 可选(布尔)

对于客户的物流着想各种果汁可能具有相同的条码,但不同的成分,其中一些是可选的 我需要通过条形码选择其成分中不含任选成分的单一果汁。

我签署了四种成分:水(可选:假),糖(可选:真),菠萝果肉(可选:假)和薄荷(可选:真)。并注册了四种果汁:一种只用水和菠萝果肉,另一种用水,菠萝果肉和糖,其他用水,菠萝果肉和薄荷,以及其他用水,菠萝果肉,薄荷和糖制成的果汁。全部使用相同的条形码。我提出一个查询,只选择与非选择性成分的果汁,在这种情况下,水和菠萝果肉。

SELECT * 
FROM juices 
INNER JOIN juice_ingredients ON (juice_ingredients.juice_id = juices.id) 
INNER JOIN ingredients ON (juice_ingredients.ingredient_id = ingredients.id) 
WHERE juices.barcode = '000000000001' AND ingredients.optional = false 

但它返回多行。什么应该改变这个查询带来只有一个,或者果汁中不含可选成分?

+0

你试过'DISTINCT'即像'SELECT DISTINCT .....' –

+0

为了使它更简单明了:你希望看到不受'juice_ingredients'引用juices'的'行(你实际上只需要看到给定的条形码,你期望只是这个ki中的一个ND。但是,我对我的简化是否正确?如果是这样,请发布“果汁”和“juice_ingredients”的完整定义。) –

回答

1

既然你没有指定要使用的数据库,你可能需要调整的SQL为您的特定数据库:

select * 
    from juices j 
where j.barcode = '000000000001' 
    and not exists (select * 
        from juice_ingredients ji 
        inner join ingredients i 
         on (i.ingredient_id = ji.ingredient_id 
         and i.optional = true) 
        where ji.juice_id = j.juice_id) 
+0

对不起。我正在使用Postgres。我会更新这篇文章。 – rplaurindo

+0

我改编你Postgres,它工作。 '''...上(i.id = ji.ingredient_id ...),其中ji.juice_id = j.id)''' – rplaurindo

2

你可以用having条款做到这一点:

SELECT juices.* 
FROM juices 
JOIN juice_ingredients ON juice_ingredients.juice_id = juices.id 
JOIN ingredients ON juice_ingredients.ingredient_id = ingredients.id 
WHERE juices.barcode = '000000000001' 
GROUP BY 1, 2 
HAVING MAX(ingredients.optional::text) = 'false' 
+0

谢谢,但与PostgreSQL中没有工作。 – rplaurindo

+0

@RafaelLaurindo错误是什么?输出? – Bohemian

+0

Bohemin,这是返回的错误:'''错误:函数min(布尔值)不存在 线7:有最小值(成分。可选)= true ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 **********错误********** 错误:函数min(boolean)不存在 SQL状态:42883 提示:没有函数与给定的名称和参数匹配类型。您可能需要添加显式类型转换。 特点:226''' – rplaurindo

相关问题