IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

group by multiple champ


Sujet :

Requêtes MySQL

  1. #1
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 525
    Par défaut group by multiple champ
    Salut,

    Comment faire pour grouper ce résultat par le nom ou le id_user ? sachant que j'ai déjà mis
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    group by us.nom,us.id_user
    Je ne voulais pas mettre toute la requête parce qu'elle parcourt 10 tables et fait plus que 200 lignes avec des cases et having....
    Pièce jointe 504388

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 455
    Par défaut
    Bonjour,
    Pour grouper par id_user/nom, il faut savoir quoi faire des autres colonnes, donc leur appliquer une fonction d'agrégation (min,max,count…).
    Par exemple pour id_user = 1 et nom = chrome, on a plusieurs valeurs pour owner_info, autorised, myValeurparam. Quelle valeur faut-il garder ?
    Seul MySQL permet de faire l'impasse ici, mais la valeur renvoyée pour les colonnes qui ne sont pas dans le group-by le seront au bon vouloir du moteur.
    Donc tu n'as pas le choix: soit une fonction d'agrégation, soit dans le group-by.

    Tatayo.

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 525
    Par défaut
    Salut,

    Je n'ai plus besoin des autres colonnes comme owner_info, blocked,autorised,myBlocked,myAutorised,valeur_param,myValeurparam, ce qui m'intéresse le plus c'est le totale de chaque utilisateur et le nbr_vu_action.

    je voudrais avoir le résultat suivant :
    id_user nom totale nbr_vu_action
    1 chrome 4 20
    31 firefox 1 1
    32 opera 8 24
    44 I_explorer 3 11

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    un simple SELECT DISTINCT sur ces quatre colonnes devrait donner le résultat attendu...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 525
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    un simple SELECT DISTINCT sur ces quatre colonnes devrait donner le résultat attendu...
    Avec distinct, ça me retourne un faux résultat.

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 455
    Par défaut
    Pour moi vu la demande initial, je dirai qu'il faut faire un GROUP BY sur la colonne totale, et regrouper sur les autres colonnes.

    Tatayo.

  7. #7
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 525
    Par défaut
    Salut tatayo,

    La colonne totale est un "alias", je ne peux pas le mettre dans group by.

  8. #8
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 455
    Par défaut
    Je ne connais pas les limites de MySQL, mais tu peux tout à fait le faire avec une sous-requête.
    On ne peut pas en dire plus, car on ne connais pas la requête…

    Tatayo.

  9. #9
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 525
    Par défaut
    Voila la requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
     
    SELECT   us.id_user ,us.nom, count(distinct(id_consult)) as totale,nbr_vu_action,c.owner_info
     
    		,(select REGEXP_REPLACE(json_extract(blocked
                         ,concat('$.'
                                 ,(case 
                         		when c.type_info in('pub','com','s_com','2s_com','3s_com','img couverture','img profil') then 'pub'
                                when c.type_info in('amitie') then 'invite_ami'
                                when c.type_info in('created_groupe','groupe','pub_groupe','com_groupe','s_com_groupe') then 'pub_groupe' end)
                                ,'.ids') 
     
                  ),'[^0-9,\\\[\\\]]','') from users where id_user=c.owner_info
             ) as blocked
             ,(select REGEXP_REPLACE(json_extract(autorised
                         ,concat('$.'
                                 ,(case 
                         		when c.type_info in('pub','com','s_com','2s_com','3s_com','img couverture','img profil') then 'pub'
                                when c.type_info in('amitie') then 'invite_ami'
                                when c.type_info in('created_groupe','groupe','pub_groupe','com_groupe','s_com_groupe') then 'pub_groupe' end)
                                ,'.ids') 
     
                  ),'[^0-9,\\\[\\\]]','') from users where id_user=c.owner_info
             ) as autorised
             ,(select REGEXP_REPLACE(json_extract(blocked
                         ,concat('$.'
                                 ,(case 
                         		when c.type_info in('pub','com','s_com','2s_com','3s_com','img couverture','img profil') then 'pub'
                                when c.type_info in('amitie') then 'invite_ami'
                                when c.type_info in('created_groupe','groupe','pub_groupe','com_groupe','s_com_groupe') then 'pub_groupe' end)
                                ,'.ids') 
     
                  ),'[^0-9,\\\[\\\]]','') from users where id_user=us.id_user
             ) as myBlocked
            ,(select REGEXP_REPLACE(json_extract(autorised
                         ,concat('$.'
                                 ,(case 
                         		when c.type_info in('pub','com','s_com','2s_com','3s_com','img couverture','img profil') then 'pub'
                                when c.type_info in('amitie') then 'invite_ami'
                                when c.type_info in('created_groupe','groupe','pub_groupe','com_groupe','s_com_groupe') then 'pub_groupe' end)
                                ,'.ids') 
     
                  ),'[^0-9,\\\[\\\]]','') from users where id_user=us.id_user
             ) as myAutorised
    		,(select REGEXP_REPLACE(json_extract(autorised
                         ,concat('$.'
                                ,case 
                         		when c.type_info in('pub','com','s_com','2s_com','3s_com','img couverture','img profil') then 'pub'
                                when c.type_info in('amitie') then 'invite_ami'
                                when c.type_info in('created_groupe','groupe','pub_groupe','com_groupe','s_com_groupe') then 'pub_groupe' end
                                ,'.valeur_param') 
     
                  ),'[^0-9,\\\[\\\]]','') from users where id_user=us.id_user
             ) as myValeurparam
    		,(select REGEXP_REPLACE(json_extract(autorised
                         ,concat('$.'
                                ,case 
                         		when c.type_info in('pub','com','s_com','2s_com','3s_com','img couverture','img profil') then 'pub'
                                when c.type_info in('amitie') then 'invite_ami'
                                when c.type_info in('created_groupe','groupe','pub_groupe','com_groupe','s_com_groupe') then 'pub_groupe' end
                                ,'.valeur_param') 
     
                  ),'[^0-9,\\\[\\\]]','') from users where id_user=c.owner_info
             ) as valeur_param
     
    		FROM consultation c
     
    		join `users` us 
     
    		left join `invitation` inv on(c.type_info in('created_groupe','groupe','pub_groupe','com_groupe','s_com_groupe'))
    		left join `groupe` grp on c.type_info in('created_groupe','groupe','pub_groupe','com_groupe','s_com_groupe')
    		left join `pub_groupe` p_groupe on(c.type_info='pub_groupe' and p_groupe.id_pub=c.id_info and grp.id_groupe=p_groupe.id_groupe   )
    		left join `comments_p_grp` com_pg on(c.type_info='com_groupe' and com_pg.id_com=c.id_info )
    		left join `s_comments_p_grp` s_com_pg on( c.type_info='s_com_groupe'  and s_com_pg.id_s_com=c.id_info and grp.id_groupe=p_groupe.id_groupe)
     
    		left join `abonnement` ab 
    		on (
    			c.type_info in('groupe','pub_groupe','com_groupe','s_com_groupe','created_groupe') 
    			and 
    			(
    				(
    					ab.id_info_abn=grp.id_groupe
    						and (
    							case c.type_info
    								when 'groupe' then ab.id_info_abn=grp.id_groupe
                                	when 'pub_groupe' then ab.id_info_abn=p_groupe.id_groupe
    								when 'com_groupe' then grp.id_groupe=(select id_groupe from pub_groupe p_g where p_g.id_pub=com_pg.id_pub )
    								when 's_com_groupe' then 
    									grp.id_groupe = (select id_groupe from `s_comments_p_grp` scpg
    									 inner join `comments_p_grp` cpg on (cpg.id_com=scpg.id_com)
    									 inner join `pub_groupe` p_g on (p_g.id_pub=cpg.id_pub)			 
    									 where scpg.id_s_com=c.id_info )
     
    							end
     
    						)
    				)
    				or (c.type_info='created_groupe' and  c.id_info=grp.id_groupe)
    			)
     
     
    		)
    		inner join relation r 
    		on (  
    			 ((r.id_emet=c.owner_info and r.id_dest=us.id_user) or (r.id_emet=us.id_user and r.id_dest=c.owner_info))
    			and (c.owner_info!=us.id_user 
     
    					and (
    					(c.type_info not in('created_groupe','groupe','amitie','pub_groupe','com_groupe','s_com_groupe') and r.etat=1)
    					or (c.type_info in('created_groupe','pub_groupe','com_groupe','s_com_groupe') and inv.etat=1 and ab.id_user=us.id_user ) 
    					or (c.type_info in('amitie') and r.id_relation=c.id_info and r.id_dest=us.id_user)
    					or (c.type_info in('groupe') and inv.id_inv=c.id_info and inv.emet_inv=c.owner_info and inv.dest_inv=us.id_user)
    				)
    			)
     
    		)
    		or (c.owner_info=us.id_user and c.type_info in('amitie','groupe') and r.id_emet=us.id_user )
    		group by c.id_consult,us.nom,us.id_user
    		having 
    				 (
    					case when c.owner_info != us.id_user then 
    						case valeur_param
    							when 1 or 2 then
    								(case myValeurparam
    									when 1 or 2 then true
    									when 3 then  
    										case when json_contains(myAutorised,c.owner_info)=1 then true
    										end
    									when 4 then 
    										case 
    											when json_contains(myBlocked,c.owner_info)=0 then true
    											 else false
    										end
    									when 5 then false
    								end)
    							when 3 then json_contains(autorised,us.id_user)=1 and
    								(case myValeurparam
    									when 1 then true
    									when 2 then true
    									when 3 then   
    										case when json_contains(myAutorised,c.owner_info)=1 then true
    										end
    									when 4 then 
    										case 
    											when json_contains(myBlocked,c.owner_info)=0 then true
    											else false
    										end
    									when 5 then false
    								end)
    							when 4 then json_contains(blocked,us.id_user)=0 and 
    								(case myValeurparam
    									when 1 then true
    									when 2 then true
    									when 3 then  
    										case when json_contains(myAutorised,c.owner_info)=1 then true
    										end
    									when 4 then 
    										case 
    											when json_contains(myBlocked,c.owner_info)=0 then true
    											 else false
    										end
    									when 5 then false
    								end)
    							when 5 then false
    							else false
    						end
    					   when c.owner_info=us.id_user then true
     
    					end 
    				)
                    order by us.id_user asc;

    Je gère les notifications de chaque utilisateur (qui sont ami(e)s) en se basant sur leurs paramètres.

  10. #10
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 455
    Par défaut
    Pour moi tu peux faire ainsi:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select us.id_user ,us.nom, sum(totale),nbr_vu_action,c.owner_info
    from
    (
    SELECT   us.id_user ,us.nom, count(distinct(id_consult)) as totale,nbr_vu_action,c.owner_info
    from)
    group by us.id_user ,us.nom, nbr_vu_action,c.owner_info

    Il y a peut-être plus simple (j'avoue, je n'ai lu que le select), mais ça fonctionne.

    Tatayo.

  11. #11
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 525
    Par défaut
    J'ai fais ce que tu m'avais proposé, mais mysql me renvoi cette erreur :
    #1248 - Every derived table must have its own alias

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    Avec distinct, ça me retourne un faux résultat.
    Lequel ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  13. #13
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 455
    Par défaut
    Après une petite recherche sur Internet: MySQL #1243

    Tatayo.

  14. #14
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    J'ai fais ce que tu m'avais proposé, mais mysql me renvoi cette erreur :
    #1248 - Every derived table must have its own alias
    Il faut juste ajouter un alias à la table dérivée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select ...
    from (select ...
         ) nom_alias
    ...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  15. #15
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 525
    Par défaut
    Salut,

    En modifiant la requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select id_user,nom,sum(totale),nbr_vu_action,owner_info,valeur_param,myValeurparam,blocked,myBlocked,autorised,myAutorised 
    from ( /* requête initiale... */) t
    group by id_user 
    order by id_user asc;

    Le résultat attendu est bon.
    Pièce jointe 504623


    Un GRAND merci à tatayo et al1_24

  16. #16
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Cette requête n'est exécutable que dans MySQL.
    Les autres SGBD refuseront de sortir des données aléatoires pour les colonnes en dehors de id_user et sum(totale).
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XI] problème avec groupe sur un champ trié par origine ?
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 11/04/2007, 15h31
  2. GROUP BY sur champ date
    Par StanmaD dans le forum Requêtes
    Réponses: 5
    Dernier message: 07/01/2007, 21h23
  3. Clause sur multiples champs 1 variable
    Par hugo69 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/10/2006, 17h10
  4. Réponses: 4
    Dernier message: 30/03/2006, 03h29
  5. concaténer par GROUP BY des champs text/varchar
    Par Fredobdx dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/07/2005, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo