NOT IN

NOT IN - SQL/NoSQL - Programmation

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

Reply

Marsh Posté le 19-11-2007 à 17:02:38   

Reply

Marsh Posté le 19-11-2007 à 17:12:56    

Tu ne confondrais pas ORDER BY et GROUP BY dès fois ?

Reply

Marsh Posté le 19-11-2007 à 17:30:06    

Ca marche pas... Ok! Mais ça renvoi une erreur ou pas les bons résultats?


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

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 :D
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!!

Reply

Marsh Posté le 19-11-2007 à 18:11:45    

Version de MySQL?
Sinon ya aussi mysql_error() qui existe, pour des messages d'erreur plus parlant.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

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

Reply

Marsh Posté le 20-11-2007 à 19:11:07    

Le not in c'est caca je crois pour les perfs :o.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

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 ?

Reply

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.

Reply

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. :'(


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 21-11-2007 à 10:25:56   

Reply

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 :D)

Reply

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

Reply

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 :
  1. SELECT
  2. nom,
  3. avg(note)
  4. FROM
  5. Eleves
  6. INNER JOIN Notes ON Eleves.id = Notes.id_eleve
  7. WHERE
  8. Eleves.nom LIKE 'B%'
  9. GROUP BY
  10. Eleves.nom
  11. HAVING
  12. avg(note)>10


Message édité par anapajari le 21-11-2007 à 18:33:41
Reply

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 ;)

Reply

Sujets relatifs:

Leave a Replay

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