Sélection de champs avec une liste de conditions

Fermé
yaplidop - 15 janv. 2015 à 16:33
jordane45 Messages postés 38301 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 22 novembre 2024 - 17 janv. 2015 à 02:09
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 !

3 réponses

watarux Messages postés 266 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 30 janvier 2023 42
15 janv. 2015 à 16:41
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
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 dimanche 28 avril 2013 Statut Membre Dernière intervention 30 janvier 2023 42
15 janv. 2015 à 17:03
les contrainte c'est quoi ? quand le client veut crée une annonce il a le choix d'une liste de contrainte ?
0
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 dimanche 28 avril 2013 Statut Membre Dernière intervention 30 janvier 2023 42
15 janv. 2015 à 17:22
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
Ce n'est pas possible car les contraintes ne sont pas fixes ; on peut en ajouter et en supprimer.
0
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 38301 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 22 novembre 2024 4 704
17 janv. 2015 à 02:09
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