NOT IN - SQL/NoSQL - Programmation
Marsh Posté le 19-11-2007 à 17:37:48
Merci pour vos reponses.
je me suis juste trompe, j'ai mis group by au lieu de order by
lorsque je mets order by num_art ou order by id_order j'ai le message d'erreur suivant:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Users\rhassani\Web site\www\fridoc\traitement.php on line 11
concernant la requette NOT IN, j'ai aucun message d'erreur, c'est juste que ca met trop de temps avt de me renvoyer 0 resultat!!
Marsh Posté le 20-11-2007 à 18:57:41
j'ai MySQL version 4.1.13.
c pas grave pour le NOT IN, le plus important est que je puisse afficher mes resultats par ordre du COUNT(), savez vous cmt pourrais je faire???
Merci
Marsh Posté le 20-11-2007 à 19:11:07
Le not in c'est caca je crois pour les perfs .
Marsh Posté le 20-11-2007 à 19:43:39
redah75 a écrit : c pas grave pour le NOT IN, le plus important est que je puisse afficher mes resultats par ordre du COUNT(), savez vous cmt pourrais je faire??? |
Qu'est ce que tu veux faire exactement ? un count sur une colone va te retourner qu'un seul enregistrement au final. Pour avoir plusieurs lignes avec count, il faut un group by. En fait j'ai l'impression que ta requète est un mix en group by et order by. Un exemple de ce que tu as en entrée et de ce que tu veux en sortie ?
Marsh Posté le 20-11-2007 à 22:58:18
pas de mot clé "WHERE" quand t'as pas de filtre (et ici t'as pas de filtre)
ensuite, GROUP BY permet d'énumérer les colonnes de regroupements (toutes celles sur lesquelles tu ne fais pas d'agrégation, donc ici... "nom" (que tu ne selectionnes même pas)
et il ne te dispense pas d'un ORDER BY, qui va te permettre de trier l'ordre des résultats, donc ici sur "num_art" par ordre "desc" pour descendant.
Marsh Posté le 21-11-2007 à 10:25:56
cad que y'a des SGBD qui font le order by en meme temps que group by.
Marsh Posté le 21-11-2007 à 10:33:11
non.
le order by et le group by sont deux instructions absolument différentes.
un effet de bord du group by, c'est en effet parfois, sur certains SGBD de faire un order by "ASC" sur les champs stipulés dans le group by (le plus facile pour effectuer un regroupement sur des tuples, c'est pour sûr de les trier, c'est donc le résultat inattendu du regroupement). mais dans tous les cas, rien ne te dispense de faire un order by dans la foulée, pour re-trier le résultat final selon d'autres critères.
le group by, c'est une intruction effectuée au début de la requête, entre le moment où les données sont retrouvées en fonction des clauses "select/from/where" et les calculs d'agrégation sur les résutlats (sum, coun, min, etc.)
ensuite, vient le having, qui permet d'effectuer un "where" une fois les fonctions d'agrégation effectuées (donc on peut filter sur le résultat des aggrégations)
enfin, le order by est évalué, sur le résultat final de la requête. il vient donc écraser tout éventuel tri qui aurait été effectué avant.
a noter que le group by n'est pas le seul élément qui effectue des tris implicites. les index utilisés par la requête font aussi un tri implicite, puisqu'ils sont ordonnées, et sont utilisés pour retrouver les lignes.
tiens, je vais mettre à jour mon topic SGBD avec un exemple... (j'espère que ça va marcher )
Marsh Posté le 21-11-2007 à 18:15:47
Bonjour a tous. et merci MagicBuzz pour tes explication...
c super, mon script marche mnt, je ne savais juste pas qu'on pouvait mettre group by et aussi order by ds la meme requete!!!
une petite question, ca sert a quoi le 'having'??? j'ai pas bien compris
merci encore une fois
Marsh Posté le 21-11-2007 à 18:32:15
quand tu utilises un fonction d'aggrégation tu ne peux pas mettre de condition sur celle-ci dans ton where.
En effet le where filtre les lignes préalablement à l'éxécution des agrégats ( comme l'expliquait magic).
La solution pour conditionner le résultat d'un agrégat est donc d'utiliser having.
Par exemple on cherche les eleves dont la moyenne est supérieure à 10 et le nom comme par B
Code :
|
Marsh Posté le 22-11-2007 à 13:37:54
OK, je ne savais pas non plus qu'on pouvais pas mettre AVG/MIN/MAX(note) > 10 dans le WHERE...
merci encore une fois pour cette info
Marsh Posté le 19-11-2007 à 17:02:38
Bonjour tout le monde,
j'aimerai juste savoir si c'est normal que la clause NOT IN ne fonctionne que sur des champs de type INT. car j'aimerai connaitre tous les enregistrement (type varchar) d'une table qui ne sont pas present ds une autre table :
SELECT * FROM table1 WHERE titre1 NOT IN (SELECT titre1 FROM table2)
et une derniere question
j'ai cette requette: SELECT COUNT(id_order) AS num_art FROM transactions WHERE GROUP BY nom
je souhaiterai classer mes resultats par num_art mais j'y arrive pas, comment devrais je faire???
Merci infiniment pour votre aide.
Reda