GROUP BY ou pas GROUP BY

Fermé
amoi - 26 févr. 2010 à 13:28
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 - 1 mars 2010 à 10:16
Bonjour,

J'utilise MySQL et je me trouve fasse a un probleme qui ne doit certes pas etre compliqué mais j'ai la tete dans le guidon ce qui complexifie tout. J'ai chercher dans les docs mais ja pas trouvé.

voici schematiquement la situation....j'ai deux tables,

Table 1
ida ¦ nom ¦
1 ¦ toto ¦
2 ¦ amoi ¦

Table2
idp ¦ ida ¦ num ¦ state ¦ date
1 ¦1 ¦ 3456¦ 0 ¦1970-12-07
2 ¦1 ¦ 8492¦ 1 ¦1580-09-30
3 ¦2 ¦ 3472¦ 0 ¦1960-12-13
4 ¦2 ¦ 684 ¦ 1 ¦1982-05-22


J'ai creeé une jolie vue via une jointure et je me retrouve avec
vue
nom¦ num ¦ state ¦ date
toto ¦ 3456¦ 0 ¦1970-12-07
toto ¦ 8492¦ 1 ¦1580-09-30
amoi ¦ 3472¦ 0 ¦1960-12-13
amoi ¦ 684 ¦ 1 ¦1982-05-22

Ma question est la suivante...si je fais un select * FROM vue GROUP BY nom;.... Comment etre sur, comment savoir quelle ligne va etre selectionner par le groupq by....est ce dans l'ordre ou il les trouve?suivant un Id de l'une des deux tables, est ce influrencé par un ORDER BY ( que je dois mettre dans la vue car le GROUP BY est prioritaire)?

Merci d'avance pour vont info, idées,
A voir également:

14 réponses

0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
26 févr. 2010 à 14:43
As-tu testé la requête SELECT * FROM vue GROUP BY nom; ?
Je ne pense pas que cette requête soit bonne...
0
oui je l'ai testé, elle est bonne, qu'est ce que te choque?
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
26 févr. 2010 à 15:00
Peux-tu me dire ce qu'elle te renvoi ?
0
elle me renvoye

toto ¦ 3456¦ 0 ¦1970-12-07
amoi ¦ 3472¦ 0 ¦1960-12-13

donc par deduction la premiere entrée du nom qu'elle trouve et qu'elle place dans une table temporaire...mais je ne suis pas sur de ca
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
26 févr. 2010 à 15:28
Je ne serais pas répondre à ta question dans ces cas là.
Cependant tu sais qu'un GROUP BY sert à regrouper des données. Donc dans ta requête il faut qu'il y ai une logique pour regrouper les données. Et dans ces cas la je pense qu'un GROUP BY avec SELECT * ca n'est pas correct.
Je me trompe peut être ceci dit. Je ne donne que mon avis.
0
ce n'est pas uniquement les informations de la colonne nom qui m'interresse....c'est tous les champs des entrée qui sont retenu pas le GROUP BY.....car je les utilise tous plus tard dans une page...c'est une sorte de Select dans un select
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
26 févr. 2010 à 15:50
Dans la requête là tu n'as mit que le champ 'nom' dans le GROUP BY.
Il faut que tu y mettes tous les champs qui t'intéressent.
0
comme ca??

SELECT * FROM vue GROUP BY nom, num, state, date;

Pourquoi??
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
26 févr. 2010 à 15:58
comme dis plus haut le group by sert a regrouper les données, c'est a dire a enlever les doublons, dans ton jeu d'enregistrement il n'y as aucune ligne en doublon, donc ca ne sert a rien

le meilleur cas ou tu serai amené a utiliser le group by c'est si tu utilisai une fonction d'agrégat (comme par exemple un cout(*)) associé a des nom de champs (et pas un *), dans ce cas au lieu de voir toutes les lignes avec doublon avec le nombre total de ligne, tu vérai les lignes sans doublon associé au nombre de lignes des doublons rencontré

j'espère m'être bien fait comprendre
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
26 févr. 2010 à 16:05
Merci garion28 c'est exactement là où je voulais en venir.
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
26 févr. 2010 à 16:06
si tu es amené a utiliser un group by lorsque tu fait un select * c'est que ta base est mal faite puisque la clé primaire ne peut pas etre en double
0
oki oki...j'apprends a grand pas avec vous les gars ...cool merci

alors pour moi le * dans le SELEC servait a dire de renvoyer tout les champs au lieu de juste les champs nommé...mais apparament c'est faux

le GROUP BY effectivement me sert a regrouper des données mais dans une seule colonne...c'est apparement pas la bonne comprehension

cependant, j'applique le GROUP BY sur une vue qui ne contient pas le champ "Clef primaire" de l'une des deux tables..est ce cela aussi??

Bref je vais poser ma question different du coup...je modifie un peu les tables et je vais essayé de m'appuyer sur l'exemple shematique pour coller a mes besoins reels, pui je vous detaille ma question.
Table 1
idj ¦ nom
98 ¦ toto
105 ¦amoi

Table 2
ida ¦ idj ¦ content
1 ¦ 98 ¦ avion
2 ¦105 ¦ bateau
3 ¦105 ¦ white
4 ¦98 ¦ carott

Table3
idp ¦ ida ¦ num ¦ state ¦ date
1 ¦1 ¦ 3456¦ 0 ¦1970-12-07
2 ¦1 ¦ 8492¦ 1 ¦1580-09-30
3 ¦2 ¦ 3472¦ 0 ¦1960-12-13
4 ¦2 ¦ 684 ¦ 1 ¦1982-05-22

Je fais une vue avec :Idj, nom, content, num, state, date

ce que je connais est le champ idj
ce que j'ai besoin d'obtenir est une table avec, pour chaque valeur du champ "content" d'un "idj" donné, la dernier entrée dans la table 3 en fonction de date,

bref de la vue je souhaite obtenir une table contenant ca
98 ¦toto ¦avion ¦ 3456¦ 0 ¦1970-12-07
98 ¦toto ¦carott ¦ 3456¦ 0 ¦1970-12-07

j'espere ma requete plus claire, merci
0
avec un exemple plus parlant...

voici la requete sur une vue qui trie les infos
SELECT *
FROM `v_pap_order`
WHERE `id_player` =98;

le resultat donne

300 4 119 7 2009-04-24 680 98 Red Balloon
300 4 119 6 2009-04-01 599 98 Red Balloon
300 4 119 4 2009-04-01 398 98 Red Balloon
150 3 119 7 2009-04-01 599 98 Red Balloon
150 3 136 6 2009-06-17 888 98 Red Balloon Dos
150 3 136 5 2009-06-10 850 98 Red Balloon Dos
150 3 119 5 2009-04-01 598 98 Red Balloon
150 3 119 3 2009-03-25 295 98 Red Balloon
150 3 250 2 2009-09-17 851 98 Red Balloon UNO_1
150 3 136 1 2009-04-24 680 98 Red Balloon Dos


et je voudrais obtenir
300 4 119 7 2009-04-24 680 98 Red Balloon
150 3 136 6 2009-06-17 888 98 Red Balloon Dos
150 3 250 2 2009-09-17 851 98 Red Balloon UNO_1

j'espere que ca aide a la comprehension :o)
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
1 mars 2010 à 10:16
En quoi la date et ce qu'il y a après te sont utiles ? Je ne comprend pas pourquoi tu veux absolument mettre une étoile dans ton select. Il ne faut sélectionner que les champs dont tu as besoin.
0