Sélection de champs avec une liste de conditions

yaplidop -  
jordane45 Messages postés 38486 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 :
$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:

3 réponses

watarux Messages postés 266 Date d'inscription   Statut Membre Dernière intervention   42
 
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
0
yaplidop
 
Bonjour, merci pour cette réponse. Mais une jointure n'aurait pas de sens puisqu'il peut y avoir plusieurs contraintes associées à une même annonce. Et je voudrais simplement que toutes celles-ci soient dans $listeContraintes.
0
watarux Messages postés 266 Date d'inscription   Statut Membre Dernière intervention   42
 
les contrainte c'est quoi ? quand le client veut crée une annonce il a le choix d'une liste de contrainte ?
0
yaplidop
 
Oui, c'est ça, il choisit les contraintes qu'il est prêt à supporter et là, je veux afficher toutes les annonces qui ne dépassent pas ce qu'il accepte.
0
watarux Messages postés 266 Date d'inscription   Statut Membre Dernière intervention   42
 
alors moi j'aurais fait 2 table une pour l'annonce et l'autre pour les contraintes.

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
0
yaplidop
 
Ce n'est pas possible car les contraintes ne sont pas fixes ; on peut en ajouter et en supprimer.
0
yaplidop
 
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).
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 751
 
Bonjour,

Sans avoir de DUMP de tes tables, pas facile de répondre exactement...
mais quelque chose de ce genre devrait pouvoir correspondre à tes besoins..
SELECT A.idAnnonce 
FROM annonce A, requiert R
WHERE A.idAnnonce = R.idAnnonce
AND R.idContrainte IN($listeContraintes)
GROUP BY A.idAnnonce 



0