Consulta de MySql sobre relación de muchos a muchos
-
05-07-2019 - |
Pregunta
Un ejemplo muy simple de una relación n: m que me desconcierta. Supongamos que tenemos dos tablas " Planta " y " Atributo " y otra mesa entre ellos manteniendo su relación con sus identificaciones:
Plant--------hasAttribute--------Attribute
P1 | A1
P1 | A2
P1 | A3
P2 | A1
P2 | A2
P3 | A2
P3 | A3
Entonces, la Planta 1 tiene Atributos 1,2 y 3. La Planta 2 tiene Atributos 1 y 2 y la Planta 3 tiene Atributos 2 y 3. Ahora, en una sola consulta, ¿cómo puedo obtener, por ejemplo? Todas las plantas que tienen atributo 2 y 3? El resultado debe devolver P1 y P3 porque ambos tienen los atributos 2 y 3. Estaba intentando la unión, pero eso también me dará P2 ... ¿alguna idea?
Solución
Consulta SQL que proporciona resultados distintos que coinciden con varias columnas
¿Es esto lo que buscas?
Otros consejos
Esta estructura de consulta evita la necesidad de una cláusula distinta (siempre que no haya registros duplicados en la tabla de resolución).
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;
select * from Plants p where 2 = (
select count(*) from HasPlants h
where h.pid = p.id and h.aid in ( a2, a3 )
)