Problème de requête de non-correspondance

dphil94 Messages postés 3 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 8 janvier 2005 - 5 janv. 2005 à 19:10
dphil94 Messages postés 3 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 8 janvier 2005 - 8 janv. 2005 à 13:00
Bonjour a tous...
Voici mon problème ;
J'ai 2 tables
table1 "qcm_sujet" avec les champs id, sujet, ....
table2 "qcm_score" avec les champs id, sujet, nom, ....

Je souhaite afficher dans une liste les sujets de la table1 qui ne sont pas saisie dans la table2 pour un nom données (saisie dans un formulaire) :

Voici ce que j'arrive à faire sous Access et que je voudrais transposer en PHP et MySQL :

Première requête (qcm_score_requete) :
SELECT qcm_score.id, qcm_score.sujet, qcm_score.nom
FROM qcm_score
WHERE (((qcm_score.nom)=[entrez un nom]));

Deuxième requête :
SELECT qcm_sujet.id, qcm_sujet.sujet, qcm_sujet.description
FROM qcm_sujet LEFT JOIN qcm_score_requete ON qcm_sujet.sujet = qcm_score_requete.sujet
WHERE (((qcm_score_requete.sujet) Is Null));

Quelqu'un pourrait il m'aider à transposer ces deux requêtes en une réquête utilisable en PHP ?

merci d'avance

4 réponses

cs_krevette Messages postés 137 Date d'inscription lundi 14 octobre 2002 Statut Membre Dernière intervention 21 janvier 2009
6 janv. 2005 à 16:39
essai mais je pense que ca devrais fonctionner



je ne comprends pas
pourquoi tu fais deux requete alors qu'avec une ca devrais fonctionner
ou alors il y a des infos spéciale dans une table que n'a pas donné


$sql="SELECT q.id as idSujet, s.id, s.sujet, s.nom FROM qcm_score s, qcm_sujet q WHERE
q.sujet = s.sujet AND
s.nom='$entrerlenom';"

et maintenant tu peux exécuté le requete et voir le résultat


si ca ne fonctionne pas n'hesite pas a expliquer d'avantage


krevette ;-)
0
dphil94 Messages postés 3 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 8 janvier 2005
6 janv. 2005 à 18:16
Je ne souhaite pas faire deux requêtes, pour être plus claire
La table qcm_sujet me fournit la liste de sujet par exemple :
id sujet
0001 Questionnaire n°1
0002 Questionnaire n°2
0003 Questionnaire n°3
0004 ...

La table qcm_score garde en mémoire les noms des participants, le score qu'ils ont obtenu pour un QCM, le nom du QCM auquel ils ont participé, par exemple :
id nom sujet score
0001 Dupont Questionnaire n°1 10
0002 Durant Questionnaire n°1 9
0003 Durant Questionnaire n°2 5
0004 Garcias Questionnaire n°3 8
...

Les participants sont identifiés par une session. Je voudrais que lorsqu'un participant sélectionne un sujet dans la table qcm_sujet, Le résultat de la requête n'affiche que les sujets auxquel il n'a pas participé, par exemple :

Pour Dupont, la liste n'afficherait pas le Questionnaire n°1 ;
Pour Durant, la liste n'afficherait pas les Questionnaire n°1 et 2 ;
Pour Garcias, la liste n'afficherait pas le Questionnaire n°3.

D'ou ma requête de non-correspondance
0
cs_krevette Messages postés 137 Date d'inscription lundi 14 octobre 2002 Statut Membre Dernière intervention 21 janvier 2009
7 janv. 2005 à 09:58
ah ok j'avais bien fais gaffe au LEFT JOIN



ben a ce moment la je pense qu'il suffit de faire comme ca



$sql="SELECT q.id as idSujet, s.id, s.sujet, s.nom FROM qcm_score s, qcm_sujet q WHERE
q.sujet != s.sujet AND
s.nom='$entrerlenom';"




si ca marche pas mysql accépte les requette imbriquer depuis ca version 4.1



SELECT s.id, s.sujet FROM qcm_sujet s, WHERE

s.nom='$entrerlenom' AND s.nom NOT IN (SELECT sujet FROM qcm_score q
WHERE q.nom=
'$entrerlenom'
)
;


si ca ne marche toujours pas (mysql version inférieur a 4.1) il faudra séparer les deux requetes

executer celle ci

SELECT sujet FROM qcm_score q
WHERE q.nom=
'$entrerlenom'


créer un liste des sujet de la forme $listeSujet="'sujet1', 'sujet2', 'sujet3'";



SELECT s.id, s.sujet FROM qcm_sujet s, WHERE

s.nom='$entrerlenom' AND s.nom NOT IN ($listeSujet

);


voila j'espérer que l'une des solutions fonctionnera



krevette ;-)
0
dphil94 Messages postés 3 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 8 janvier 2005
8 janv. 2005 à 13:00
Merci à krevette, j'ai essayé toutes tes requêtes mais aucune ne correspond à ce que je voulais. J'ai cependant trouver une solution. Voila comment j'ai procèdé des fois que cela serve à quelqu'un :

J'ai créé une table supplémentaire qcm_score_nom avec uniquement le champs sujet.
J'utilise une requête d'extraction qui m'alimente cette table :
SELECT * FROM qcm_score WHERE nom = '$nom'
J'insère dans la table qcm_score_nom le résultat de cette requête :
INSERT INTO qcm_score_nom(sujet) VALUES('$sujet')
Il me reste ensuite plus qu'a faire ma requête de nom correspondance avec les tables qcm_sujet et qcm_score_nom :
SELECT qcm_sujet.id, qcm_sujet.sujet, qcm_sujet.description FROM qcm_sujet LEFT JOIN qcm_score_nom ON qcm_sujet.sujet = qcm_score_nom.sujet WHERE qcm_score_nom.sujet Is Null"
Cette requête m'affiche la liste des sujets que la personne n'a pas encore réalisé.
Pour finir j'efface les enregistrements de la table qcm_score_nom :
DELETE FROM qcm_score_nom
Le seul problème qu'il peut y avoir, c'est l'utilisation simultané par plusieurs utilisateurs, cependant l'utlisation étant limité à quelques postes et sur un réseau intranet il n'y a pas de grands risques. Toute fois si quelqu'un à une solution, je suis preneur.
0
Rejoignez-nous