8711 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Débutant en programmation, je bosse sur un logiciel qui permet la gestion de candidat et j'ai un soucis sur une requête qui me tape sur les nerfs.

Lors d'un ajout de candidat, on lui attache une fonction, une spécialité, des langues pratiquées, des mots clefs qui le définissent et des documents d'entretien.

Voilà le MCD: http://www.casimages.com/img.php?i=130723023908712744.png

J'ai un soucis sur la requête de recherche des mes candidats. Une recherche implique obligatoirement des 'AND' et non des 'OR'. Par exemple, si je cherche une candidat qui est développeur et qui est associé aux mots clefs 'ADOBE CS6' et DREAMWEAVER', il faut obligatoirement que mon résultat me donne tous les candidat qui ont au moins ces deux mots la. Actuellement, voici la requète générée lorsque que je cherche ce candidat:

SELECT DISTINCT civcandi, nomcandi, precandi, libfonction, commentcandi, dispocandi, mobilitecandi, typecontratcandi, candidat.idcandi , libmotclef FROM candidat, posseder, fonction , definir, motclef
WHERE candidat.idcandi = posseder.idcandi
AND fonction.idfonction = posseder.idfonction
AND fonction.idfonction = 1
AND candidat.idcandi = definir.idcandi
AND motclef.idmotclef = definir.idmotclef
AND motclef.libmotclef IN ('ADOBE CS6', 'DREAMWEAVER' )
GROUP BY libmotclef
HAVING COUNT(libmotclef) >= 2


Malheureusement, impossible de retrouver ces candidats de cette manière, sauriez-vous pourquoi?

Je suis désolé si ma question paraît bête, mais comme je disais, je débute et je m'arrache les cheveux là-dessus depuis bien trop longtemps, c'est pour ça que je fais appel à votre aide.

Si vous avez besoin d'information en plus, je ne suis pas loin!

Merci beaucoup!

GnZ
Modifié par GnZ (24 Jul 2013 - 17:51)
Bonjour,

As-tu tester ta requête dans un interpréteur ? As-tu un retour ? Et quel est-il ?

Ensuite ta requête c'est un peu le fouillis, si tu veux faire des liens entre table c'est avec un "inner join" et non une condition ...

Peux-tu nous ajouter des sauts de ligne parce que c'est franchement illisible...
Bonjour et merci de ta réponse!

J'ai testé la requête sur ma base MySql, j'obtiens bien un résultat mais pas celui que j’attends:
http://www.casimages.com/img.php?i=130723050402239842.png

Là, on retrouve bien des candidats. Le n°45 n'a que 'DreamWeaver', mais le 46 à bien les deux mots-clefs.

Je viens de me rendre compte d'un autre soucis, j'imagine que ça vient de ma programmation pour le coup... Sous MySql, j'ai seulement 2 résultats, sous mon appli PHP, j'ai 16 résultats! oO

Plus j'avance dans ce projet, plus je suis pommé...
Modifié par GnZ (23 Jul 2013 - 17:05)
Modérateur
mini-truc a écrit :

Ensuite ta requête c'est un peu le fouillis, si tu veux faire des liens entre table c'est avec un "inner join" et non une condition ...


Heu non, on peut très bien faire une jointure sans les commandes spécifiques (inner join, natural join). Tout dépend de ce que l'on attend en sortie.

En effet le code n'est pas très sexy à lire. L'indentation, c'est bien. Voir ce post par exemple :
Regarde l'indentation du SELECT de Julie. Nettement plus lisible n'est ce pas ? Par contre, ne pas oublier les espaces pour éviter les fautes de syntaxe.

Pour t'aider à créer ta requête, commence par faire simple et ensuite tu augmentes les critères. Fait un select avec candidat et fonction. Regarde ce que ça te sort. Ensuite tu augmentes tes critètes avec les autres tables (les unes après les autres tout en regardant le résultat à chaque fois). Si un résultat est erroné, tu vires une jointure et tu regardes le résultat.

Au passage, c'est normal le distinct ? Pour le moment et à priori, je ne vois pas l'intérêt du group by et having. Perso, quand je suis pas sûr de ma requête, j'utilise soit la ligne de commande vers mysql ou phpmyadmin ou un logiciel comme navicate ou mysql query ou etc.
Bonjour Niuxe!

Merci de ta réponse Smiley cligne
Pour les jointures je me disais aussi...! Sinon j'avais plus qu'à tout recommencer Smiley langue
Le soucis, c'est qu'il y'a énormément de façon de faire, et de choses à savoir. Après, jsuis persuadé que les INNER JOIN sont pratique, mais je ne les ai encore jamais utilisé, et je préfère faire comme je connais pour cette première appli.

Je prend note de l'indentation pour la prochaine! J'ai rarement l'habitude de venir poster sur des forums, de peur de me faire envoyer bouler haha!

Merci de ton conseil, je vais les quelques scripts php qui me manque, ensuite je reprend la requête de zéro.

Pour le Distinct, c'est simplement pour éviter les doublons au cas ou. Pour le Group By et Having, c'est une solution que l'on m'avait donné pour sortir les candidat qui ont au moins 2 mot clefs, d'ou le HAVING COUNT(). Mais c'est pas bon, vu que ça ne marche pas, ou du moins, ça ne suffit pas^^

La synthaxe de la requête te semble correcte? Je veux dire, toutes ces conditions, et tout ces 'AND'?

Merci à vous!
Modifié par GnZ (24 Jul 2013 - 14:23)