2016-03-03 4 views
0

Я пытаюсь написать простой JOIN, который должен соответствовать двум очень элементарным условиям. Рассмотрим эти таблицы:MYSQL имеет много связей с condiitons

'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, где эти идентификаторы совпадают:

attribute_product_variation_id = 136 
AND 
variation_id = 57 AND 73 

My 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'''''' 73 и' Variation'.'id' = 57 в то же время, что вы не повторяете AttributeVariation'.'variation_id' = 'Variation'.'id' по какой-то причине. – Mihai

+0

Нужен ли мне другой тип JOIN, это не сложно –

+0

Каковы ваши ожидаемые результаты? Обычно это обрабатывается с помощью агрегации. – sgeddes

ответ

1

Это должно получить, что вы хотите, но делает это с двойным использованием из таблиц. Это альтернатива использованию объединений и наличием клаузулов и агрегатов. Основная часть запроса начинается с изменения продукта, которое AT LEAST соответствует одному идентификатору (57). Затем присоединяется к таблице вариантов, чтобы получить значение атрибута. Он также присоединяется к одной и той же таблице вариантов продуктов тем же атрибутом/продуктом И ИД вариации = 73 (второй идентификатор). Этот второй псевдоним соединяется с вариациями по его идентификатору, чтобы получить последний атрибут.

Я бы индексы на вашем столе с помощью

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 vari_id, нет необходимости искать соединения с другими (-ами).

+0

Огромное спасибо, что он отлично работает, мне пришлось переместить несколько вещей, чтобы соответствовать моему живому прецеденту и подключить его к моей структуре, очень приятно :) –

0

Предполагая, что вы хотите вернуть attribute_variations, которые имеют обе вариации идентификаторы 57 и 73 и вернуть присоединившихся результаты, это должно работать:

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 - возможно, вам просто нужно добавить 'где av.attribute_product_variation_id = 136'? – sgeddes

+0

Я ответил на другой ответ как ответ, потому что я смог работать с этим помощником mysql в моей инфраструктуре, у меня нет знаний, чтобы включить ваш ответ - спасибо за ваш ответ, тем не менее! –

Смежные вопросы