Sélection de champs avec une liste de conditions
yaplidop
-
jordane45 Messages postés 40050 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 40050 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
J'ai une table "annonce" contenant en particulier la clef primaire "idAnnonce". J'ai une autre table "requiert" (l'association) contenant pour chaque ligne un "idAnnonce" et "idContrainte".
L'idée est de n'afficher que les annonces associées à des "idContraintes" tous contenus dans la liste $listeContraintes.
Je n'ai pas trouvé l'ensemble vite sur la toile alors j'ai procédé ainsi :
L'ensemble vide est en fait :
Ça ne fonctionne pas et j'ai l'erreur suivante :
« #1242 - Subquery returns more than 1 row »
Cela signifie qu'une requête à plusieurs résultats ne veut pas être comparée à l'ensemble vide...
Comment faire pour ne sélectionner que les idAnnonce dont les contraintes sont toutes dans la liste $listeContraintes ?
Merci d'avance !
J'ai une table "annonce" contenant en particulier la clef primaire "idAnnonce". J'ai une autre table "requiert" (l'association) contenant pour chaque ligne un "idAnnonce" et "idContrainte".
L'idée est de n'afficher que les annonces associées à des "idContraintes" tous contenus dans la liste $listeContraintes.
Je n'ai pas trouvé l'ensemble vite sur la toile alors j'ai procédé ainsi :
$requete = "SELECT idAnnonce FROM annonce WHERE (SELECT idContrainte FROM requiert WHERE requiert.idAnnonce = annonce.idAnnonce AND idContrainte NOT IN($listeContraintes)) = (SELECT idAnnonce FROM annonce WHERE 0=1)";
L'ensemble vide est en fait :
idAnnonce FROM annonce WHERE 0=1
Ça ne fonctionne pas et j'ai l'erreur suivante :
« #1242 - Subquery returns more than 1 row »
Cela signifie qu'une requête à plusieurs résultats ne veut pas être comparée à l'ensemble vide...
Comment faire pour ne sélectionner que les idAnnonce dont les contraintes sont toutes dans la liste $listeContraintes ?
Merci d'avance !
A voir également:
- Sélection de champs avec une liste de conditions
- Liste déroulante excel - Guide
- Liste code ascii - Guide
- Liste de diffusion whatsapp - Guide
- Liste déroulante en cascade - Guide
- Liste de numéro de téléphone suspect - Guide
3 réponses
bonjour je ne suis pas un pro mais je pense que ce que tu essaye de faire n'est pas possible si tu veux pouvoir faire une requête liant 2 table d'une base de donnée je dirais d'utiliser JOIN en msql il y a plusieurs façon de faire une jointure tu devrais y trouver ton bonheur
https://sql.sh/cours/jointures/inner-join
https://sql.sh/cours/jointures/inner-join
J'ai trouvé une solution. C'est de la bidouille mais elle fonctionne. Je crée une nouvelle contrainte d'identifiant idContrainte = 0 qui est associée par "requiert" à toutes les "annonce"s. La requête à faire est ensuite :
SELECT idAnnonce FROM annonce
INNER JOIN requiert ON requiert.idAnnonce = annonce.idAnnonce
WHERE idContrainte IN($listeContraintes)
GROUP BY annonce.idAnnonce
HAVING COUNT(idRequirement) = 1;
Le but étant de ne prendre que les annonces dont le nombre de contraintes non dans la liste est 1 (la contrainte qu'aucune ne respecte : la n°0).
SELECT idAnnonce FROM annonce
INNER JOIN requiert ON requiert.idAnnonce = annonce.idAnnonce
WHERE idContrainte IN($listeContraintes)
GROUP BY annonce.idAnnonce
HAVING COUNT(idRequirement) = 1;
Le but étant de ne prendre que les annonces dont le nombre de contraintes non dans la liste est 1 (la contrainte qu'aucune ne respecte : la n°0).
la table d'annonce stock l'annonce mais la contrainte stock l'id de l'annonce et les contrainte sélectionner par exemple tu auras 3 contrainte de possible au total et bien au départ dans la base de donnée sont mise a NULL et a la création si il a sélectionner des contrainte tu les passe a 1
ensuite avec ça tu pourras faire afficher l'annonce et la liste des contraire avec une requête