2016-03-03 38 views
0

我试着写一个简单的JOIN,必须满足两个非常基本的条件。考虑这些表:MYSQL有很多加入条件

'attrbibute_variations'

id | attribute_product_variation_id | variation_id 
-------------------------------------------------- 
286 | 136       | 57 

287 | 136       | 59 

288 | 136       | 73 

'变化'

id | attribute_id 
----------------- 
57 | 1 

59 | 5 

73 | 12 

我想在variations加入其中,这些ID匹配:

attribute_product_variation_id = 136 
AND 
variation_id = 57 AND 73 

我的SQL是如下,但给出一个空集:

SELECT 
    * 
FROM 
    `attribute_variations` AS `AttributeVariation` 
INNER JOIN 
    variations` AS `Variation` 
     ON (
     (
      (
       `AttributeVariation`.`variation_id` = `Variation`.`id` 
      ) 
      AND (
       `Variation`.`id` = 57 
      ) 
     ) 
     AND (
      (
       `AttributeVariation`.`variation_id` = `Variation`.`id` 
      ) 
      AND (
       `Variation`.`id` = 73 
      ) 
     ) 
    ) 
WHERE 
    `AttributeVariation`.`attribute_product_variation_id` = 136 

似乎很简单,但结果是一个空集?

在此先感谢!

+0

你不能有'Variation'.'id' = 73 AND'Variation'.'id' = 57同时永远不要你重复AttributeVariation'.'variation_id' ='Variation'.'id'因为某些原因。 – Mihai

+0

我需要一种不同类型的JOIN,这并不复杂 –

+0

您的预期结果是什么?通常这是通过聚合来处理的。 – sgeddes

回答

1

这应该得到你想要的东西,但随着双用做它的表格。它是使用连接并具有子句和聚合计数的替代方法。查询的主要部分以AT LEAST符合所述问题(57)的产品变体开始。然后加入变体表以获取属性值。它也通过相同的属性/产品加入到相同的产品变体表中,并且变体ID = 73(所讨论的第二个ID)。第二个别名通过ID加入到变体中以获得最终属性。

我会通过

table    index 
attrbibute_variations (variation_id, attribute_product_variation_id) 
variations   (id, attribute_id) 

select 
     av1.id, 
     av1.attribute_product_variation_id, 
     v1.attribute_id as Attribute1, 
     v2.attribute_id as Attribute2 
    from 
     attrbibute_variations av1 
     JOIN variations v1 
      on av1.variation_id = v1.id 
     join attrbibute_variations av2 
      on av1.attribute_product_variation_id 
      = av2.attribute_product_variation_id 
      AND av2.variation_id = 73 
       join variations v2 
       on av2.variation_id = v2.id 
    where 
     av1.variation_id = 57 

对你的表索引然后,如果你想要一个第三所需的属性,你可以复制/粘贴开始AV2和V2别名部分。

如果查询甚至找不到具有57个variation_id的记录,则无需查找其他(s)的连接。

+0

非常感谢它完美的工作,我不得不移动一些东西来适应我的实际使用情况,并将其插入我的框架,非常令人满意:) –

0

假设你想返回attribute_variations有57和73,并返回连接结果都变化的ID,这应该工作:

select * 
from attribute_variations av 
    join variations v on av.variation_id = v.id 
where av.attribute_product_variation_id = 136 and 
     av.variation_id in (57,73) and 
     exists (
     select 1 
     from attribute_variations av2 
     where av.attribute_product_variation_id = av2.attribute_product_variation_id 
      and av2.variation_id in (57,73) 
     group by av.attribute_product_variation_id 
     having count(distinct av.variation_id) = 2 
    ) 
+0

谢谢,但也返回一个空集 –

+0

@AlanA - 也许你只需要添加'where av.attribute_product_variation_id = 136'? – sgeddes

+0

我已经标记了其他回复作为答案,因为我能够将其应用到我的框架的mysql帮助程序中,我没有知识来插入您的答案 - 尽管如此,谢谢您的答案! –