Page 1 sur 2
Problème : Effectué 2 requêtes en une !
Posté : 01 août 2007, 12:10
par angebleu17
Bonjour,
J'aimerais effecuté 2 requête en une, mais je suis un peu perdue ! Car les 2 requete non pas les même conditions (WHERE)
En fait je veux sélectionné tous les id ou le nombre de ok est égal a $nb et ou ok = oui.
Mais j'aimerais aussi récupérer le champ rep dans la meme table mais ou ok = null et sans la condition having.
Code : Tout sélectionner
$sql2 = "SELECT DISTINCT (id), count(ok) AS nb_ok
FROM matable
WHERE ok = 'oui'
GROUP BY id
HAVING nb_ok = '$nb'
ORDER BY id ASC ";
Je ne vois pas trop comment faire pour mettre la 2eme requete dans la 1er. La 2eme requete serait :
Code : Tout sélectionner
$sql2 = "SELECT DISTINCT (id), rep
FROM matable
WHERE ok = null
GROUP BY id
ORDER BY id ASC ";
Déjà je me demande si c'est possible et comment faire ?
Car en faisant 2 requête différentes ça renvoi 2 id donc c'est plus compliqué par la suite.
Posté : 01 août 2007, 14:42
par Sékiltoyai
Tu peux essayer avec ca :
Code : Tout sélectionner
SELECT DISTINCT (id), count(ok) AS nb_ok, null AS rep
FROM matable
WHERE ok = 'oui'
GROUP BY id
HAVING nb_ok = '$nb'
ORDER BY id ASC
UNION
SELECT DISTINCT (id), null AS nb_ok, rep
FROM matable
WHERE ok = null
GROUP BY id
ORDER BY id ASC
Posté : 01 août 2007, 15:18
par angebleu17
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 !
Posté : 01 août 2007, 16:08
par Sékiltoyai
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.
Posté : 02 août 2007, 12:00
par angebleu17
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 ?
Posté : 02 août 2007, 12:42
par Hubert Roksor
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.
Posté : 02 août 2007, 14:00
par Sékiltoyai
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.
Posté : 02 août 2007, 14:44
par angebleu17
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
Posté : 02 août 2007, 15:32
par d0m
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.
Posté : 02 août 2007, 16:33
par angebleu17
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):
ç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..)
Posté : 02 août 2007, 16:42
par d0m
ça veut dire que tu veut que nb_ok est égale à la
chaine '$nb'
il faut le passer en variable
Posté : 02 août 2007, 16:57
par angebleu17
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')
Posté : 02 août 2007, 18:32
par Sékiltoyai
Tu peux essayer (champ1, champ2) IN(SELECT champ1, champ2 ...)
Ca peut peut être marcher…
Posté : 02 août 2007, 19:07
par d0m
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.
Posté : 03 août 2007, 09:29
par angebleu17
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à !