GROUP BY ou pas GROUP BY
amoi
-
0z0z Messages postés 108 Date d'inscription Statut Membre Dernière intervention -
0z0z Messages postés 108 Date d'inscription Statut Membre Dernière intervention -
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,
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,
14 réponses
As-tu testé la requête SELECT * FROM vue GROUP BY nom; ?
Je ne pense pas que cette requête soit bonne...
Je ne pense pas que cette requête soit bonne...
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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
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.
Il faut que tu y mettes tous les champs qui t'intéressent.
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
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
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
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
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
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)
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)