Estoy tratando de crear un filtro para encontrar rápidamente el producto adecuado en función de algunas especificaciones. Pero no puedo hacer que MySQL funcione. He estado buscando en Google por un tiempo, pero no puedo encontrar una pregunta similar. Espero que puedas ayudarme.
This is the products table -------------------- | id | name | -------------------- | 1 | Product 1 | | 2 | Product 2 | | 3 | Product 3 | -------------------- This is the relation table for the specifications -------------------------------- | id | specs_id | prod_id | -------------------------------- | 1 | 1 | 1 | | 2 | 5 | 1 | | 3 | 6 | 2 | | 4 | 9 | 3 | | 5 | 11 | 2 | ---------------------------------Este es MySQL como quiero que funcione.
$sql = "SELECT p.id, p.name FROM products p JOIN specs s ON p.id = s.prod_id WHERE s.specs_id = 1 AND s.specs_id = 5 AND s.specs_id = 7 GROUP BY p.id";Este ejemplo no dará ningún resultado.
$sql = "SELECT p.id, p.name FROM products p JOIN specs s ON p.id = s.prod_id WHERE s.specs_id = 1 AND s.specs_id = 5 GROUP BY p.id";Esto devolverá el producto con ID 1
Item_id no existe en su tabla. También usó AND en lugar de OR , por lo que ninguna entrada pudo coincidir. Ninguno puede tener specs_id 2,5 y 7 al mismo tiempo.
SELECT p.id, p.name FROM products p JOIN specs s ON p.id = s.prod_id WHERE s.specs_id = 5 OR s.specs_id = 2 OR s.specs_id = 7 GROUP BY p.id;Tal vez OR o IN es lo que está buscando:
SELECT DISTINCT p.id, p.name FROM products p JOIN specs s ON p.id = s.prod_id WHERE s.specs_id IN (1,5);o
SELECT DISTINCT p.id, p.name FROM products p JOIN specs s ON p.id = s.prod_id WHERE s.specs_id=1 OR s.specs_id=5;Además, use DISTINCT en lugar de GROUP BY si no tiene funciones agregadas.
Puede hacer como primero filtrar la tabla de specs con el specs_id requerido y luego unir ese resultado con la tabla de products .
select p.id, p.name from (select * from products p ) p join (select * from specs where specs_id in (1,5,7)) s on p.id = s.prod_id group by p.id