Requete qui se comporte bizarrement des qu'il y a plus d'une entrée

Requete qui se comporte bizarrement des qu'il y a plus d'une entrée - SQL/NoSQL - Programmation

Marsh Posté le 16-01-2006 à 18:21:19    

Bonjour à tous et bonne année !
Je suis en train de travailler sur une base de questions/réponses pour un formulaire d'inscription.
J'ai deux tables qui ont la structure suivante :
La table QUESTION contient les 71 questions à poser au visiteur.
La table DETAILS contient les reponses du visiteur
 
Table QUESTION :
- QID (PK)
- Question (Contient la question à poser)
 
Table DETAILS :
- DID (PK)
- QUESTION_QID (FK, pointe sur QUESTION.QID)
- VISITEUR_PID (FK, pointe sur VISITEUR.PID, c'est l'id du compte connecté)
- Reponse
 
Voila le principe, je cherche à récupérer un tableau en php contenant les QID des questions qui n'ont pas été posé à l'utilisateur, j'ai donc écris la requête suivante :
 

Code :
  1. "SELECT question.QID,question.QUESTION FROM question,details WHERE details.VISITEUR_PID = '1' AND details.QUESTION_QID != question.QID"


 
Je l'ai testé en insérant un enregistrement de test dans DETAILS, avec QUESTION_QID = 1, la requête fonctionne, le problème survient lorsque l'on ajoute plusieurs entrées dans DETAILS, en effet, dès qu'on a deux enregistrements, la requête retourne tout les QID, parfois il y a même plusieurs copies du même QID.
J'ai du mal à comprendre d'ou vient le problème vu que ma requete me parait logique, donc je me tourne un peu vers vours au cas ou :)
Je précise que toutes les tables sont en InnoDB.
Quelqu'un voit il une erreur dans mon raisonnement ?

Reply

Marsh Posté le 16-01-2006 à 18:21:19   

Reply

Marsh Posté le 16-01-2006 à 19:39:47    

SELECT question.QID,question.QUESTION  
FROM question,details  
WHERE details.QUESTION_QID = question.QID
AND details.VISITEUR_PID = '1'  
 
pourquoi tu avais mis un !=, faut mettre un = sinon la jointure ne marche pas. Si tu as encore des doublons, tu fais un SELECT DISTINCT ... mais normalement tu n'en auras pas
 
De plus le != n'est pas normalisé en SQL, pour dire différent c'est <> et pas !=


Message édité par moi23372 le 16-01-2006 à 19:40:58
Reply

Marsh Posté le 16-01-2006 à 19:46:05    

Je met un différent parce que je souhaite retourner tout les QID qui ne sont pas deja inscrit dans la table DETAILS ou VISITEUR_PID = 1
Ta requete fonctionne mais fait l'inverse :)
Je ne savais pas pour le !=, j'ai essayé avec <> mais j'obtiens tout de même quelques doublons (mais moins, curieusement j'ai un doublon pour tout les QID qui ne sont pas dans la table DETAILS). Etrange, heureusemnt que le distinct est la ;)
Curieusement avec le <> il retourne tout les champs, en doublonnant ceux qui ne repondent pas aux criteres du WHERE
J'ai fais quelques tests et c'est le meme probleme : Si details ne contient qu'une entrée il filtre bien, mais quand il y en a plus avec un QID different mais un PID identique, alors il ne filtre plus rien.
Si quelqu'un sait le pourquoi des doublons, je suis interessé pour ma culture ;)
Merci pour la remarque en tout cas


Message édité par l3eleg le 16-01-2006 à 19:51:25
Reply

Marsh Posté le 16-01-2006 à 20:40:06    

SELECT QID, QUESTION
FROM QUESTION
WHERE QID NOT IN  
(SELECT question.QID
FROM question,details  
WHERE details.QUESTION_QID = question.QID  
AND details.VISITEUR_PID = '1' );
 
voila ça fais l'inverse ça :D

Reply

Marsh Posté le 16-01-2006 à 20:50:47    

Oué j'me disais qu'il fallait surement en passer par une sous requête.
Ca marche en tout cas, merci, j'hésitais à utiliser une sous requête je pensais qu'il y avait un autre moyen ;)


Message édité par l3eleg le 16-01-2006 à 20:54:37
Reply

Marsh Posté le 16-01-2006 à 21:07:14    

il y a plein de moyen pour arriver à un résultat. Moi perso je suis friant des sous requetes car c'est tres puissant.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed