1
votes

MySQL sélectionne parmi deux tables en fonction de plusieurs conditions dans la même table

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 commentaires

s.item_id Il n'y a pas de item_id dans le tableau des spécifications, pas celui que vous nous montrez de toute façon


Je suppose que vous voulez dire s.prod_id


Ma faute. Il est censé être prod_id. Je l'ai changé maintenant.


3 Réponses :


2
votes

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;


2 commentaires

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.



0
votes

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


1 commentaires

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.



1
votes

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);


3 commentaires

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.