SELECT DISTINCT et plusieurs champs : possibeul ?

SELECT DISTINCT et plusieurs champs : possibeul ? - SQL/NoSQL - Programmation

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 ? :heink:

Reply

Marsh Posté le 12-03-2003 à 21:17:26   

Reply

Marsh Posté le 12-03-2003 à 21:24:41    

Skylight a écrit :

Voilà
apparement ca m'envoie toute la patate ...  


 :??:


---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
Reply

Marsh Posté le 12-03-2003 à 21:27:35    

exemple
 
table contact
 

societe    |   nom_collab
-----------+----------------
microsoft  |   billou
microsoft  |   jobs
microsoft  |   bush
wanadoo    |   saddam


 
 
SELECT DISTINCT societe FROM contact;
 
ok, j'ai
 

microsoft
wanadoo


 
 
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
-----------+----------------
microsoft  |   billou
microsoft  |   jobs
microsoft  |   bush
wanadoo    |   saddam


 
 
et j'aimerais  
 

societe    |   nom_collab
-----------+----------------
microsoft  |   billou
wanadoo    |   saddam


 
:/
 
j'ai testé plusieurs syntaxes .. DISTINCT (champ),truc ...


Message édité par skylight le 12-03-2003 à 21:28:52
Reply

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)


Message édité par urd-sama le 12-03-2003 à 21:30:38

---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
Reply

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).
pour ta question, je crois que c'est plutot du group by societe (à confirmer, je confonds tjs ces trucs)


 
group by societe va simplement regrouper les trucs ensemble mais c'est deja trié ...
 
ptet du coté de having, faudrait que je matte ...

Reply

Marsh Posté le 12-03-2003 à 21:32:51    

GROUP BY societe
 
[edit] grilled


Message édité par ZeBorG le 12-03-2003 à 21:33:39
Reply

Marsh Posté le 12-03-2003 à 21:37:19    

Ah ben si, ca marche [:mlc]
 
bizarre, j'étais persuadé que GROUP BY ne supprimais pas les doublons

Reply

Marsh Posté le 12-03-2003 à 21:39:45    

Skylight a écrit :

Ah ben si, ca marche [:mlc]
 
bizarre, j'étais persuadé que GROUP BY ne supprimais pas les doublons

GROUP BY xxx= regroup les éléments de la colone xxx qui ont la même valeur

Reply

Marsh Posté le 12-03-2003 à 21:40:46    

ok :jap:
 
 
je confondais avec le order :cry:

Reply

Marsh Posté le 12-03-2003 à 21:42:26    

Skylight a écrit :

Ah ben si, ca marche [:mlc]
 
bizarre, j'étais persuadé que GROUP BY ne supprimais pas les doublons


 
raté, c'est l'inverse.

Reply

Marsh Posté le 12-03-2003 à 21:42:26   

Reply

Marsh Posté le 12-03-2003 à 21:47:37    

Le DISTINCT ne porte pas sur une colonne, mais sur toute la ligne [:proy]

Reply

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 [:proy]  


sur les champs sélectionnés dans la requete


---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
Reply

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 :D
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
-----------+----------------  
microsoft  |   3
wanadoo    |   1


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 12-03-2003 à 21:54:07    

Urd-sama a écrit :


sur les champs sélectionnés dans la requete

oui, les lignes du résultat :)

Reply

Marsh Posté le 12-03-2003 à 21:55:27    

Précision :
 
Il est tout a fait possible de faire un GROUP BY sur plusieurs champs...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 12-03-2003 à 21:55:38    

Mara's DAD -> :jap:
 
au moins tout le monde a appris quelque chose ce soir :D

Reply

Marsh Posté le 12-03-2003 à 21:56:23    

Mara's dad a écrit :

Précision :
 
Il est tout a fait possible de faire un GROUP BY sur plusieurs champs...


GROUP BY champ1,champ2
 
lequel sera prioritaire ?

Reply

Marsh Posté le 12-03-2003 à 21:57:02    

Skylight a écrit :


GROUP BY champ1,champ2
 
lequel sera prioritaire ?


 
A ton avis ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 12-03-2003 à 21:57:30    

champ1 ? [:meganne] :D

Reply

Marsh Posté le 12-03-2003 à 21:58:03    

Skylight a écrit :


GROUP BY champ1,champ2
 
lequel sera prioritaire ?

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)


Message édité par mrbebert le 12-03-2003 à 21:58:39
Reply

Marsh Posté le 12-03-2003 à 21:59:54    

J'en était sûr  :non:  
 
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  :D  
 
Tu confonds encore avec ORDER BY !
 


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 12-03-2003 à 22:00:28    

:cry:

Reply

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.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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 :heink:
 
Exemple :
 


 ID | V1 | V2 | V3
----|----|----|----
  1 |  A |  A |  A
  2 |  A |  A |  B
  3 |  A |  B |  A
  4 |  A |  B |  B
  5 |  B |  A |  A
  6 |  B |  A |  B
  7 |  B |  B |  A
  8 |  B |  B |  B


 

Code :
  1. SELECT COUNT(ID), V1, V2, V3 FROM T
  2. -> ERROR: V1, V2 et V3 ne font pas partie de la clause GROUP BY


 

SELECT COUNT(ID), V1, V2, V3 FROM T GROUP BY V1, V2, V3


 

CNT | V1 | V2 | V3
-----|----|----|----
   1 |  A |  A |  A
   1 |  A |  A |  B
   1 |  A |  B |  A
   1 |  A |  B |  B
   1 |  B |  A |  A
   1 |  B |  A |  B
   1 |  B |  B |  A
   1 |  B |  B |  B


 

SELECT COUNT(ID), V1
FROM T
WHERE V2 = V3
AND ID > 4
GROUP BY V1


 
=> Seules lignes à répondre aux conditions
 

 ID | V1 | V2 | V3
-----|----|----|----
   5 |  B |  A |  A
   8 |  B |  B |  B


 
=> Donc, comme V1 est identique dans les deux lignes, on n'a qu'une seule ligne, donc un COUNT = 2 :
 

CNT | V1 |
-----|----|
   2 |  B |


 

SELECT COUNT(ID)
FROM T
WHERE V2 = 'A'
AND V1 <> V3
GROUP BY V1


 
Seules lignes à répondre aux conditions :
 

ID | V1 | V2 | V3
----|----|----|----
  2 |  A |  A |  B
  5 |  B |  A |  A


 
Donc comme V1 est différent dans les deux lignes, même si on ne l'affiche pas, on a deux lignes :
 

CNT
---
  1
  1


Voilà, ça sert à ça, et uniquement à ça le GROUP BY.
 
-- Edit : Quelques explication et une correction --


Message édité par MagicBuzz le 12-03-2003 à 22:15:05
Reply

Marsh Posté le 12-03-2003 à 22:12:31    

on va décomposer ton post, magic, calme ... :D

Reply

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

Reply

Marsh Posté le 12-03-2003 à 22:18:08    


 
J'sais pas s'qui zon avec SQL ce soir :pt1cable:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 12-03-2003 à 22:22:10    

Mara's dad a écrit :


 
J'sais pas s'qui zon avec SQL ce soir :pt1cable:  

C'est un sujet hautement passionnant, à n'importe quelle heure du jour et de la nuit :)

Reply

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
 
http://www.mysql.com/doc/en/Group_by_functions.html


 
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 ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 12-03-2003 à 22:47:11    

moi je dirais, regarde du côté de la clause LIMIT

Reply

Marsh Posté le 12-03-2003 à 22:48:26    

b'en c'est pas mon post :D  
 
Le miens il est là :
http://forum.hardware.fr/forum2.php3?post=33559&cat=10
 
(MySQL 3.23.54)


Message édité par ZeBorG le 12-03-2003 à 22:49:07
Reply

Marsh Posté le 12-03-2003 à 22:52:39    

arghbis a écrit :

moi je dirais, regarde du côté de la clause LIMIT

:heink:

Reply

Marsh 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...)

Reply

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


Message édité par MagicBuzz le 12-03-2003 à 22:54:50
Reply

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

Reply

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 [:figti]  :D

Reply

Marsh Posté le 12-03-2003 à 22:58:28    

MagicBuzz a écrit :

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

MySQL se veut grand publique, j'imagine qu'ils ont voulu "protéger" les utilisateurs...
 
[deit] correction des fotes [:tilleul]


Message édité par ZeBorG le 12-03-2003 à 23:06:25
Reply

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 ? [:totoz]

Reply

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!

Reply

Marsh Posté le 12-03-2003 à 23:26:42    

arghbis a écrit :

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!

par ce que ce n'est pas du tout le résultat qu'il cherche à avoir...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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