MySql запрос по отношению ко многим ко многим - PullRequest
2 голосов
/ 30 июля 2009

Очень простой пример отношений n: m, который меня озадачивает. Предположим, у нас есть две таблицы «Завод» и «Атрибут» и еще одна таблица между ними, в которой хранятся их отношения с их идентификаторами:

Plant--------hasAttribute--------Attribute
               P1 | A1
               P1 | A2
               P1 | A3
               P2 | A1
               P2 | A2
               P3 | A2
               P3 | A3 

Итак, Завод 1 имеет Атрибуты 1,2 и 3. Завод 2 имеет Атрибуты 1 и 2, а Завод 3 имеет Атрибуты 2 и 3. Теперь, в одном запросе, как я могу получить, например, все растения, которые имеют атрибуты 2 и 3? Результат должен вернуть P1 и P3, потому что они оба имеют атрибуты 2 и 3. Я пробовал объединение, но это также даст мне P2 ... есть идеи?

Ответы [ 3 ]

2 голосов
/ 30 июля 2009
1 голос
/ 30 июля 2009

Эта структура запроса исключает необходимость в отдельном предложении (при условии, что в таблице разрешения нет повторяющихся записей).

SELECT p.PlantID
FROM
  Plant p INNER JOIN PlantAttribute pa
    ON p.PlantID = pa.PlantID AND pa.AttributeID = 1
  INNER JOIN PlantAttribute pa2
    ON p.PlantID = pa2.PlantID AND pa2.AttributeID = 2;
0 голосов
/ 30 июля 2009
select * from Plants p where 2 = ( 
  select count(*) from HasPlants h
     where h.pid = p.id and h.aid in ( a2, a3 ) 
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...