DISTINCT et ORDER BY

DISTINCT et ORDER BY - SQL/NoSQL - Programmation

Marsh Posté le 30-10-2008 à 15:26:21    

Bonjour a tous !
 
Je me lance dans la programmation php, MySQL et compagnie... et donc, j'ai un probleme.
 
Je souhaiterais sortir une liste de numero et son id classé par ordre croissant d'un autre numero sans afficher le second numero, et sans doublons
 
ex: table : truc
 
 fact         val
5684       2554
12          78522
12           445
725         669
12           444
778        78522
3            2554
725         7898
 
 
SELECT DISTINCT fact FROM truc ORDER BY val
 
il me dit que ca marche pas (le champ val doit aparaitre dans la reponse a la requete pour qu'il classe par val)
 
SELECT DISTINCT fact, val FROM truc ORDER BY val
 
il me renvoie trop de valeur !! je ne veux que le fact en distinct, pas l'association fact et val...
 
je voudrais qu'il me renvoie :
 
fact
 
12
725
3
5684
778
 
je crois avoir croisé du regard a peu pret tout les forums et documentation que je pouvais comprendre (francais, anglais, allemand et espagnol... peut etre qu'un slovene a la reponse... mais je comprend pas le slovene...)
 
Si qqun a la solution... Merci d'avance  
 
Bonne journée

Reply

Marsh Posté le 30-10-2008 à 15:26:21   

Reply

Marsh Posté le 30-10-2008 à 15:46:24    

Tu ne peux pas faire un tri sur des données que tu ne connais pas, donc normal. A noter que DISTINCT supprime les vrais doublons, ce qui n'est pas le cas là. Il faut faire un traitement en PHP.


---------------
http://www.aideinfo.com/  Whois adresses IP/domaines le plus évolué !!  FAQ Free Mobile
Reply

Marsh Posté le 30-10-2008 à 15:54:18    

aideinfo a écrit :

Tu ne peux pas faire un tri sur des données que tu ne connais pas, donc normal. A noter que DISTINCT supprime les vrais doublons, ce qui n'est pas le cas là. Il faut faire un traitement en PHP.


 
Merci !
 
Par contre, Objection votre honneur !!! je connais les valeurs, je voudrais juste ne pas les afficher car cela m'affiche plus des doublons dans la colonne fact... Or, je veux juste une occurence de chaque fact, pas 2, sinon ma requete va faire des doublons dans mon affichage !
 
 
merci qd mem !

Reply

Marsh Posté le 30-10-2008 à 15:55:33    

ca n'a pas de sens ton truc, si on prend ton exemple, 12 a 3 val différents, tu utilises leque pour faire ton classement?
 
12          78522
12           445
12           444  
 
ce que tu veux sans doute sans trop le savoir c'est un truc style
 

Code :
  1. select fact,val_min
  2. from
  3. (select fact,min(val) as val_min
  4. from brlbrl
  5. group by fact)
  6. order by val_min


 
et si tu n'utilises pas val_min ben tu l'affiches pas, c'est tout

Reply

Marsh Posté le 30-10-2008 à 16:03:53    

Merci Casimimir !
J'etais en train de chercher de ce coté (requete imbriquée). j'essaye ca et je renvoie le resultat

Reply

Marsh Posté le 30-10-2008 à 16:15:07    

En fait, j'approfondis mon explication :
je veut retirer une liste de numero de facture ayant un critere
dans ma table, j'ai des numeros de facture en double, triple voir plus (paiement en plusieurs fois). Moi, je veux une liste des factures classée par date dans une table. Or les factures de paiement en plusieurs fois risque d'apparaitre plusieurs fois (plusieurs ligne dans la reponse a ma requete). Donc avec un distinct, je regle le probleme... mai je ne peux plu classer par date ou je perd le distinct...
En gros, j'ai le choix entre la bonne liste pas dans le bon ordre, et une liste pas bonne dans l'ordre...  
je sais pas si c'est plus clair... mais hésitez pas a me demander ce que vous ne comprenez pas...


Message édité par maskleouf le 30-10-2008 à 16:18:01
Reply

Marsh Posté le 30-10-2008 à 16:30:33    

RE... (je fais mon sujet tout seul)
 
SELECT fact, dated  
FROM (
   SELECT DISTINCT fact  
   FROM lfixe  
   WHERE struc = 'Pour les essais'  
   AND datef >24100)
ORDER BY dated
 
et ca me renvoie a mes jeunes années (des trucs que je faisais avant) et a une erreur => #1248 - Every derived table must have its own alias


Message édité par maskleouf le 30-10-2008 à 16:31:16
Reply

Marsh Posté le 30-10-2008 à 16:36:22    

faut juste lire le message, manifestement il te dit que tu dois nommer (donner un alias) a ta table dérivée (le select se trouvant entre parenthèse).
 
donc rajoute un "as qquechose" ou "qquechosetoutcourt" (je connais pas mysql) après la parenthèse

Reply

Marsh Posté le 30-10-2008 à 16:50:59    

Merci.
 
Je suis en train d'essayer toutes les syntaxes possibles mais rien...
quand il ne me demande pas d'alias, il me dit que j'ai fai une erreur de syntaxe... MySQL... Mon amour...

Reply

Marsh Posté le 30-10-2008 à 17:02:58    

Bon bah , je crois que j'ai trouvé...
 
La solution se trouve du coté des requetes imbriquées...
 
SELECT DISTINCT fact
FROM (
   SELECT fact, val
   FROM truc
   ORDER BY val
) t   (<------- c'est avec ce t qu'on fait l'alias)
 
Merci a ceux qui ont participé

Reply

Marsh Posté le 30-10-2008 à 17:02:58   

Reply

Marsh Posté le 30-10-2008 à 17:31:20    

ta requete est égale a  
 

Code :
  1. select distinct fact
  2. from truc

Reply

Marsh Posté le 30-10-2008 à 17:33:35    

pas exactement, passke avec ce que tu a dis, tu a pas les fact dans l'ordre des val.  
 
En gros, ma requete, elle met la table dans l'ordre, et apres, elle lit les fact

Reply

Marsh Posté le 30-10-2008 à 17:51:25    

ca c'est ce que tu crois, on ne peut jamais se fier a l'ordre des lignes sans un order by explicite.
 
la bonne méthode est celle que je t'ai donné

Reply

Marsh Posté le 30-10-2008 à 17:54:19    

tout a fait daccord, on peut pas etre sur. Mais ca marche quand meme !
je vien de le faire sur une 4 tables de plus de 40 lignes chacune, et pas une erreur...
 
ta methode fonctionne aussi tres bien et elle est plus sure... mais, je suis tres "c'est moi qui l'ai fait" si tu vois ce que je veux dire.  
 
En tout cas, je te remercie beaucoup de ton aide !

Reply

Marsh Posté le 31-10-2008 à 11:48:28    

A priori on peut, aussi, écrire ceci :
 

Code :
  1. select distinct(T.FACT), T.VAL
  2. from TRUC T
  3. order by T.VAL;



---------------
| 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 03-11-2008 à 14:18:52    

Bah non... soit je me suis planté, soit ca marche pas... j'ai l'impression que le distinct avec les parentheses... et bah les parentheses, autant pisser dans un violon...

Reply

Marsh Posté le 03-11-2008 à 14:21:38    

Après ça depends aussi du SGBD.


---------------
| 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 03-11-2008 à 14:33:15    

bah c'est du MySQL (j'avais précisé au depart). Je crois que ta methode fonctionne en Access et PostgreSQL... mais le MySQL se moque eperduement des parentheses !
Merci quand meme de ta participation !

Reply

Marsh Posté le 03-11-2008 à 14:40:16    

Bah disons que j'avais jamais testé en MySQL donc c'était au cas où.
Car c'est plus simple syntaxiquement ;).


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

Sujets relatifs:

Leave a Replay

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