Problème : Effectué 2 requêtes en une !

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème : Effectué 2 requêtes en une !

par angebleu17 » 03 août 2007, 09:46

Pourtant sur d'autre requête avec des simples quote sur une variable ça marche. Enfin j'ai modifié mon code en mettant

Code : Tout sélectionner

count(ok)= '".$nb."'
mais l'erreur est toujours là !

par d0m » 03 août 2007, 09:40

déjà je te l'ai déjà dit plus haut ton code est faux :
Ce n'est pas

Code : Tout sélectionner

....count(ok)= '$nb'....
mais

Code : Tout sélectionner

count(ok)= '".$nb."'
Sinon php n'évaluera jamais la variable $nb, entre simple quote $nb ce n'est pas 1 ou 2 ou un autre entier c'est la chaine $nb

par angebleu17 » 03 août 2007, 09:29

Code : Tout sélectionner

$sql2 = "SELECT DISTINCT (id_personne) FROM matable WHERE (id_personne, count(ok)) IN (SELECT id_personne, count(ok) FROM matable WHERE ok= 'oui' GROUP BY id_personne HAVING count(ok)= '$nb' ORDER BY count(ok) )
Cette requête me renvoie : Invalid use of group function

Je pen,se que c'est du au count, car si j'enléve les group by et order by l'erreur est toujours là !

par d0m » 02 août 2007, 19:07

Mais en mettant le having ça ne me retourne rien !
[/code]

tu l'as écris correctement?
et on ne peut pas sélectionné plusieurs champs avec IN :
tu ne sélectionnes pas plusieurs champs, tu le fais sur le champ id_personne.

par Sékiltoyai » 02 août 2007, 18:32

Tu peux essayer (champ1, champ2) IN(SELECT champ1, champ2 ...)
Ca peut peut être marcher…

par angebleu17 » 02 août 2007, 16:57

Mais en mettant le having ça ne me retourne rien !

et on ne peut pas sélectionné plusieurs champs avec IN :

Code : Tout sélectionner

WHERE id_personne IN(SELECT id_personne FROM matable WHERE ok= 'oui')

par d0m » 02 août 2007, 16:42

Code : Tout sélectionner

HAVING nb_ok = '$nb'
ça veut dire que tu veut que nb_ok est égale à la chaine '$nb'

il faut le passer en variable

Code : Tout sélectionner

requete = "SELECT ............ HAVING nb_ok = '".$nb."'....

par angebleu17 » 02 août 2007, 16:33

J'ai essayé ceci :

Code : Tout sélectionner

$sql8 = "SELECT DISTINCT (id_personne), rep, count(ok) as nb_ok, date FROM matable WHERE id_personne IN(SELECT id_personne FROM matable WHERE ok= 'oui') GROUP BY id_personne ORDER BY date ASC
Avec cette requête quand j'affiche nb ok et rep, ça me met les bon résultats, mais si j'ajoute une clause pour afficher les personnes qui ont bien répondu ($nb est égal au nombre de question, donc le nombre de ok qui est égal à oui doit être égal a $nb):

Code : Tout sélectionner

HAVING nb_ok = '$nb'
ça ne met plus rien

Et de même si j'ajoute la clause pour afficher les personnes qui ont bien répondu :

Code : Tout sélectionner

AND id_personne IN(SELECT id_personne FROM matable WHERE rep= (SELECT bonne_rep FROM table 2..)

par d0m » 02 août 2007, 15:32

je verrais une requête du genre :

Code : Tout sélectionner

SELECT id_personne FROM ma_table WHERE id_personne IN(SELECT id_personne FROM ma_table WHERE ID_question=1 AND Ok='oui') AND id_personne IN(SELECT id_personne FROM ma_table WHERE ID_question=2 AND Ok='oui') AND id_personne IN(SELECT id_personne FROM ma_table WHERE ID_question=1 AND Rep=(SELCTT bonne_reponse from table2....))
mais je dois dire que tes tables sont étranges et pas pratiques d'où cette requête complexe.

par angebleu17 » 02 août 2007, 14:44

En fait je veux récupérer les id des personnes qui ont bien répondu au question, dans ma table j'ai un champ id_rep et un champ ok que je met a oui lorsque la réponse est la bonne.
Aprés j'ai un champ rep (qui correspond a une question ou il faut répondre par une saisie d'un chiffre) donc il n'y a pas d'id rep pour cette reponse.

Voilà un petit extrait de ma table pour illustrer :

Code : Tout sélectionner

ID_personne ID question ID reponse Rep Ok 1 1 5 NULL oui 1 2 6 NULL oui 1 3 NULL 750 NULL 2 1 5 NULL oui 2 2 7 NULL oui 2 3 NULL 2451 NULL
Voilà, donc oui veut dire que c'est la bonne réponse (si ce n'est pas la bonne je met non). Par contre pour Rep je net met pas de oui ou non car la réponse a cette question je la détermine a la fin.

Donc je voudrais récupérer les ID des personnes qui ont bien répondu aux questions (ok = oui) et qui ont aussi bien répondu a la question Rep (rep = (SELECT bonne_rep FROM table2 WHERE ...') ).

Voilà, j'espére que j'ai était plus précise

par Sékiltoyai » 02 août 2007, 14:00

Ouais, mais c'est un peu illogique ce que tu dis, vu que si tu utilises un ET, alors tu essayeras de récupérer des enregistrements pour lesquels ok='oui' ET ok est NULL, il y a un petit problème logique puisque les deux ne peuvent pas être vrais en même temps.
Comme beaucoup de supporteurs disent ici, est ce que tu pourrais dire ce que tu veux faire exactement, ce que tu veux avoir, plutôt que comment tu veux le faire. C'est à dire explique moi exactement le résultat que tu veux obtenir, en explicitant le rôle de chaque champ pour appuyer ton explication.

par Hubert Roksor » 02 août 2007, 12:42

angebleu17 : un conseil, si tu ne mets pas en forme tes requêtes, que tu mélanges du PHP et du SQL inutilement et que tu ne respectes pas les consignes qui s'affichent lorsque tu postes un sujet, tu réduis considérablement tes chances d'obtenir de l'aide. Sékiltoyai est assez gentil pour s'intéresser à ton sujet, mais beaucoup de membres ont pris pour habitude d'ignorer les sujets ne respectant pas les règles.

À part ça, j'en profite pour préciser que le résultat de toute comparaison avec NULL est NULL. C'est pour ça que "IS NULL" existe.

par angebleu17 » 02 août 2007, 12:00

J'ai réussi a faire la requête mais j'ai un petit soucis !

Voici ma requête :

Code : Tout sélectionner

$sql2 = "SELECT DISTINCT (id), count(ok) AS nb_ok, rep, date FROM matable WHERE ok = 'oui' AND rep = 'NULL' GROUP BY id HAVING nb_ok = '$nb' UNION SELECT DISTINCT (id), NULL AS nb_ok, rep, date FROM matable WHERE ok = 'NULL' AND rep = (SELECT bonne_rep FROM table2 WHERE ...') GROUP BY id ORDER BY date ASC";


En fait j'aimerais que les ID répondent aux 2 requêtes, c'est à dire les ID où si nb_ok = $nb et rep = bonne_rep. Le union ça retourne les enregistrements de chaque requete.
Au lieu de union ça serait plutot un ET en fait. Mais on ne peut pas mettre de AND !

Comment faire (en sachant qu'il faut laisser les clause WHERE et HAVING) ??
Suis-je obliger de faire 2 requêtes indépendantes ?

par Sékiltoyai » 01 août 2007, 16:08

Dans la 1ère, il est égal à null, et dans la seconde, il est égal à ce qu'il doit être. Essaye de comprendre la requète un peu.
Avec un UNION, on est obligé d'avoir les mêmes types de champ pour les requètes que l'on unie, donc si on a un varchar et un int par exemple, on doit avoir un varchar et un int pour les 2 requètes, ici on a donc :
1ère requète : id, count(ok), null
2nde requète : id, null, rep
De cette manière, on est sûr que l'on n'a pas de conflit de champs. Après, libre à toi d'organiser cela autrement si count(ok) et rep sont du même type, et que ca ne te déranges pas de les avoir sur la même colonne quand tu vas récupérer les enregistrements.

par angebleu17 » 01 août 2007, 15:18

En enlevant les order by ça marche, mais seuleument il m'affiche des données en trop.
Dans la 1er requete, rep est égal à 0 et dans la 2eme il à des valeurs différentes. Je voudrais récupérer que les valeur de rep dans la 2eme requête !