2016-03-03 74 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幫助程序中,我沒有知識來插入您的答案 - 儘管如此,謝謝您的答案! –