J'essaie de créer un filtre pour trouver rapidement le bon produit en fonction de certaines spécifications. Mais je n'arrive pas à faire fonctionner MySQL. Je gooogling depuis un moment maintenant mais je ne trouve pas de question similaire. J'espère que vous pourrez m'aider.
$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";
Voici le MySQL comme je veux qu'il fonctionne.
$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";
Cet exemple ne donnera aucun résultat
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 | ---------------------------------
Cela renverra le produit avec l'ID 1
3 Réponses :
Item_id n'existe pas dans votre table. Vous avez également utilisé AND insted de OR , donc aucune entrée ne peut correspondre. Aucun ne peut avoir les specs_id 2,5 et 7 en même temps.
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;
Mais si OU est utilisé, ce ne sera pas une correspondance exacte ou est-ce que je pense mal. Disons que specs_id 1,5, et 6 est utilisé, il renverra les produits 1 et 2. Je veux qu'il n'y ait pas de correspondance alors.
vous avez raison OU vous obtiendrez un résultat non inclusif de 1,5,7.
Vous pouvez faire comme d'abord filtrer le tableau specs avec le specs_id requis, puis joindre ce résultat avec le tableau produits .
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
oui, je l'ai essayé et le résultat est le même que les réponses ci-dessus. Il n'y a pas de correspondance exacte. Je ne sais pas si je me trompe totalement sur la façon de procéder. Je souhaite affiner les résultats lorsque plus de spécifications sont sélectionnées au lieu d'obtenir plus de résultats. J'ai l'impression que ce serait facile à résoudre mais cela ne semble pas être le cas. Merci de votre aide.
Peut-être que OR ou IN est ce que vous recherchez:
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;
ou
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);
cela donnera également un résultat. Vote favorable
Je l'ai essayé mais cela ne donnera pas une correspondance exacte. Il renverra également les produits 1 et 2 si vous sélectionnez 1,5, 6
Vous pourriez peut-être ajouter le résultat attendu à la question avec différents paramètres. Avec les 1,5,6 de specs_id , vous devriez obtenir les produits 1 et 2 à moins que vous ne vouliez quelque chose de différent.
s.item_idIl n'y a pas deitem_iddans le tableau des spécifications, pas celui que vous nous montrez de toute façonJe suppose que vous voulez dire
s.prod_idMa faute. Il est censé être prod_id. Je l'ai changé maintenant.