SELECT DISTINCT et plusieurs champs : possibeul ? - SQL/NoSQL - Programmation
Marsh Posté le 12-03-2003 à 21:24:41
Skylight a écrit : Voilà |
Marsh Posté le 12-03-2003 à 21:27:35
exemple
table contact
societe | nom_collab |
SELECT DISTINCT societe FROM contact;
ok, j'ai
microsoft |
moi en plus de ca, j'aimerai recuperer le champ nom_collab de la ligne qu'il prend en distinct ...
donc
SELECT DISTINCT societe,nom_collab FROM contact;
me donne :
societe | nom_collab |
et j'aimerais
societe | nom_collab |
j'ai testé plusieurs syntaxes .. DISTINCT (champ),truc ...
Marsh Posté le 12-03-2003 à 21:30:23
en faisant ton distinct sur 2 champs, il t'aurait éviter de retourner 2 enregistrements égaux (par exemple tu aurais microsoft;bilou à 2 places, il te le rendrait qu'une fois).
pour ta question, je crois que c'est plutot du group by societe (à confirmer, je confonds tjs ces trucs)
Marsh Posté le 12-03-2003 à 21:32:31
Urd-sama a écrit : en faisant ton distinct sur 2 champs, il t'aurait éviter de retourner 2 enregistrements égaux (par exemple tu aurais microsoft;bilou à 2 places, il te le rendrait qu'une fois). |
group by societe va simplement regrouper les trucs ensemble mais c'est deja trié ...
ptet du coté de having, faudrait que je matte ...
Marsh Posté le 12-03-2003 à 21:32:51
GROUP BY societe
[edit] grilled
Marsh Posté le 12-03-2003 à 21:37:19
Ah ben si, ca marche
bizarre, j'étais persuadé que GROUP BY ne supprimais pas les doublons
Marsh Posté le 12-03-2003 à 21:39:45
Skylight a écrit : Ah ben si, ca marche |
GROUP BY xxx= regroup les éléments de la colone xxx qui ont la même valeur
Marsh Posté le 12-03-2003 à 21:42:26
Skylight a écrit : Ah ben si, ca marche |
raté, c'est l'inverse.
Marsh Posté le 12-03-2003 à 21:47:37
Le DISTINCT ne porte pas sur une colonne, mais sur toute la ligne
Marsh Posté le 12-03-2003 à 21:52:18
mrBebert a écrit : Le DISTINCT ne porte pas sur une colonne, mais sur toute la ligne |
sur les champs sélectionnés dans la requete
Marsh Posté le 12-03-2003 à 21:54:03
Oulala que de mélanges !
SELECT DISTINCT societe,nom_collab FROM contact;
OK, tous les enregs retournés sont différents
SELECT DISTINCT societe FROM contact;
ET
SELECT societe FROM contact GROUP BY societe;
Retourne la même chose dans ce cas car il n'y a qu'un seul champs.
Si tu veux plusiseurs champs, tu fait un GROUP BY sur le champs pour lequel tu veux un regroupement, mais pour les autres, ils faut donner une fonction "d'agrégation".
Par exemple
SELECT societe, nom_collab FROM contact GROUP BY societe;
Va planter
Ok, il fait le regroupement sur societe, mais que fait-il avec nom_collab ?
Avec ton exemple, quel nom_collab doit-il retourner pour microsoft ?
Ben le serveur peut pas le deviner.
Donc par exemple
SELECT societe, first(nom_collab) FROM contact GROUP BY societe;
Dans ce cas, la fonction d'agrégation est first. elle retourne le premier élément d'un ensemble.
D'autres fonctions ? count(), sum(), average(), last()...
Une fonction d'agrégation, c'est donc une fonction qui retourne un seul élément pour un ensemble.
Bon un dernier exemple :
SELECT societe, count(nom_collab) NB FROM contact GROUP BY societe;
doit donner :
societe | NB |
Marsh Posté le 12-03-2003 à 21:54:07
ReplyMarsh Posté le 12-03-2003 à 21:55:27
Précision :
Il est tout a fait possible de faire un GROUP BY sur plusieurs champs...
Marsh Posté le 12-03-2003 à 21:55:38
Mara's DAD ->
au moins tout le monde a appris quelque chose ce soir
Marsh Posté le 12-03-2003 à 21:56:23
Mara's dad a écrit : Précision : |
GROUP BY champ1,champ2
lequel sera prioritaire ?
Marsh Posté le 12-03-2003 à 21:57:02
Skylight a écrit : |
A ton avis ?
Marsh Posté le 12-03-2003 à 21:58:03
Skylight a écrit : |
Y a pas de champ prioritaire, c'est un couple.
Il regroupera toute les lignes où champ1 ET champ2 sont identiques
Mais tu pourras avoir des lignes différentes ayant le même champ1 (et donc des champs2 différents)
Marsh Posté le 12-03-2003 à 21:59:54
J'en était sûr
Ben non !
Aucun !
Ce que tu lui demande c'est de ne pas avoir deux lignes de résultat qui ont le même couple champ1, champs2.
Aucun des deux n'est prioritaire, çà n'as pas de sens de se poser cette question
Tu confonds encore avec ORDER BY !
Marsh Posté le 12-03-2003 à 22:05:12
T'inquiète pas !
Un serveur de BDD, faut le prendre comme un gros bourrin qui fait STRICTEMENT ce qu'on lui dit.
C'est juste un bon ouvrier. Faut lui demander calmement ce qu'on veut.
La difficulté est de savoir l'exprimer.
Pour çà, y'a pas de secret, faut d é c o m p o s e r.
Marsh Posté le 12-03-2003 à 22:11:17
GROUP BY, ça sert que pour les calculs, chais pas ce que vous avez à le sortir à toutes les sauces pour chaque problème
Exemple :
|
Code :
|
SELECT COUNT(ID), V1, V2, V3 FROM T GROUP BY V1, V2, V3 |
CNT | V1 | V2 | V3 |
SELECT COUNT(ID), V1 |
=> Seules lignes à répondre aux conditions
ID | V1 | V2 | V3 |
=> Donc, comme V1 est identique dans les deux lignes, on n'a qu'une seule ligne, donc un COUNT = 2 :
CNT | V1 | |
SELECT COUNT(ID) |
Seules lignes à répondre aux conditions :
ID | V1 | V2 | V3 |
Donc comme V1 est différent dans les deux lignes, même si on ne l'affiche pas, on a deux lignes :
CNT |
Voilà, ça sert à ça, et uniquement à ça le GROUP BY.
-- Edit : Quelques explication et une correction --
Marsh Posté le 12-03-2003 à 22:17:34
Mara's dad > le first() n'exist pas dans MySQL il me semble
http://www.mysql.com/doc/en/Group_by_functions.html
Marsh Posté le 12-03-2003 à 22:18:08
J'sais pas s'qui zon avec SQL ce soir
Marsh Posté le 12-03-2003 à 22:22:10
Mara's dad a écrit : |
C'est un sujet hautement passionnant, à n'importe quelle heure du jour et de la nuit
Marsh Posté le 12-03-2003 à 22:22:10
ZeBorG a écrit : Mara's dad > le first() n'exist pas dans MySQL il me semble |
Ok, mais c'est la première fois que tu parles de MySql dans ce post !
Mais si c'est un first qui n'éxiste pas qui te gène, ben faut réfléchir un peut, y'a surement moyen de s'en sortir.
Quelle version de MySql ?
Marsh Posté le 12-03-2003 à 22:48:26
b'en c'est pas mon post
Le miens il est là :
http://forum.hardware.fr/forum2.php3?post=33559&cat=10
(MySQL 3.23.54)
Marsh Posté le 12-03-2003 à 22:52:39
ReplyMarsh Posté le 12-03-2003 à 22:53:12
par défaut, mySQL utilise le premier lors d'un GROUP BY (comme si il y avez un first() en fait...)
Marsh Posté le 12-03-2003 à 22:54:23
encore un truc vachement standard tiens...
pour info, select a, b from t group by a plante si b nb'est pas un fonctrion d'agrégation (calcul) d'après la norme SQL
Marsh Posté le 12-03-2003 à 22:57:37
ZeBorG a écrit : par défaut, mySQL utilise le premier lors d'un GROUP BY (comme si il y avez un first() en fait...) |
correction : ça dépands du ORDER BY en fait...
Marsh Posté le 12-03-2003 à 22:58:11
ZeBorG a écrit : correction : ça dépands du ORDER BY en fait... |
Effectivement, ca ne revient pas tout à fait au même
Marsh Posté le 12-03-2003 à 22:58:28
MagicBuzz a écrit : encore un truc vachement standard tiens... |
MySQL se veut grand publique, j'imagine qu'ils ont voulu "protéger" les utilisateurs...
[deit] correction des fotes
Marsh Posté le 12-03-2003 à 22:59:12
ZeBorG a écrit : MySQL ce veux grqnd publique, j'imagine qu'ils ont voulu "protéger" les utilisateurs... |
du francais ?
Marsh Posté le 12-03-2003 à 23:22:52
ben pq tu essaie pas limite???
genre select distinct machin, truc from matable group by machin limit 1;
à peu de choses près, ce doit être ça!
Marsh Posté le 12-03-2003 à 23:26:42
arghbis a écrit : ben pq tu essaie pas limite??? |
par ce que ce n'est pas du tout le résultat qu'il cherche à avoir...
Marsh Posté le 12-03-2003 à 21:17:26
Voilà
SELECT DISTINCT truc FROM pouet;
ok, on a les valeurs en un exemplaire.
SELECT DISTINCT truc,hehe FROM pouet;
apparement ca m'envoie toute la patate ...
donc ?