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 :

un Group by non trié sur plusieurs tables.


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut un Group by non trié sur plusieurs tables.
    Bonjour,

    J'ai testé de nombreuses façons mais les informations me remontent toujours non triées ...

    J'ai 3 tables (membre, relation et lien)

    BUT : Je voudrais le lien ayant le plus de hits pour chaque membre

    Table membre : la structure est simple (id_membre)
    Table relation : la structure est simple (id_membre, id_lien)
    Table lien : La structure (id_lien, hits)

    J'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.id_liens, c.hits, max(c.hits) as total
    FROM user a, relation b, lien c 
    WHERE a.id_membre = b.id_membre and b.id_lien = c.id_lien 
    group by a.id_membre
    order by total DESC;
    le résultat fonctionne presque, je récupère bien un id_lien par membre mais pas celui avec le plus de hits ^^

    Avez-vous une solution a mon problème, je planche depuis plusieurs heures sans résultat

    ====
    exemple table user (2 users) :
    User
    1
    2

    exemple table relation :
    User, lien
    1,1
    1,2
    1,5
    2,3
    2,8

    Exemple table lien :
    Lien, hits
    1,10
    2,100
    3,4
    5,1
    8,500

    Le resultat devra etre
    lien
    2,100 pour le user 1 et
    8,500 pour le user 2
    ====

    Merci d'avance

  2. #2
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    Je ne demande pas forcement la requête exacte mais une piste de travail ...
    j'ai tourné la requête dans pas mal de sens et je n'arrive toujours pas a mon résultat ?
    Si un spécialiste des requêtes veut bien prendre un peu de temps à trouver une solution ou à m'aiguiller vers celle-ci, merci d'avance ....

    J'ai oublié de préciser quelques éléments dont les structures des tables
    User :
    id_user int(11)

    User_lien :
    id_user int(11)
    id_liens int(11)

    Liens :
    id_liens int(11)
    hits int(11)

    et je précise également qu'un lien peut-etre affecté à plusieurs utilisateurs, d'ou ma table relation ...

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    C'est normal avec MySQL : votre syntaxe n'est pas correcte(vos colonnes c.id_liens et c.hits ne sont ni dans le group by, ni dans une fonction d'agrégat), et MySQL, plutôt que vous le dire, vous renvoi la première valeur qui lui passe sous la main...

    Il faut donc que vous passiez par une sous requête qui va chercher les couples (id_membre, max(hits)), puis une jointure sur cette sous requête pour récupérer l'id du lien

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    au passage :

    pour votre confort, utilisez les jointures normalisées (INNER JOIN)
    pour notre confort, utilisez les balises code

  5. #5
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci aieeeuuuu,

    Je viens de tester avec :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT a.id_user, c.id_liens, c.url, c.hits, max(c.hits) as total
    FROM user a
    INNER JOIN user_liens b ON a.id_user=b.id_user
    INNER JOIN liens c ON b.id_liens = c.id_liens
    WHERE a.type = 2
    group by a.id_user, c.id_liens, c.url, c.hits
    order by total DESC

    Merci pour la balise code, c'est nettement mieux ^^

    le where ajouté correspond à une condition (membre = vip) ...

    J'obtiens l'ensemble des liens pour les membres VIP ...
    et non pas le lien ayant le plus de hits pour chaque membre

    Cependant, on vient également de me faire remarquer que un lien peut-être lié à plusieurs users (normal dans le principe)

    il faudrait donc, plutôt que d'obtenir l'unicité pour un membre , avoir l'unicité pour un lien remplissant les conditions précédentes ???

    Exemple, j'ai 3 users (1, 2 et 3)

    la table relation (user / lien) avec par exemple
    1,1
    1,2
    1,3
    2,4
    2,2
    3,3

    la table liens (lien / hits) avec
    1,10
    2,100
    3,1000
    4,10000

    je dois obtenir

    lien / hits
    3,1000
    4,10000

    il faut cependant garder une relation avec la table user pour prendre en compte son statut (a.type = 2)

    J'espere que mon problème est plus claire ?

    Merci de m'orienter vers mon souhait de résultat ...

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    dans votre résultat attendu, vous ne mettez pas l'id_user, et vous dédoublonnez visiblement.

    Si vous voulez le max hits par user (ce qui semble etre le cas d'après votre requete), vous pouvez faire comme ceci :

    Code : 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
     
    SELECT 
    	a.id_user, 
    	c.id_liens,  
    	MAX(c.hits) AS total
    FROM (
    	SELECT 
    			id_user
    		,	MAX(hits) as MaxHits
    	FROM	user_liens
    	INNER JOIN	Liens 
    		ON			Liens.id_liens = user_liens.id_liens
    	GROUP BY id_user
    ) AS MaxHits
    INNER JOIN usr a
    	ON		a.id_user = MaxHits.id_user
    INNER JOIN liens c 
    	ON		c.hits = MaxHits.MaxHits
    WHERE a.type = 2
    GROUP BY a.id_user, c.id_liens, c.url, c.hits
    ORDER BY total DESC
    sinon enlevez l'id_user et faites un distinct

  7. #7
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Je viens de tester la requête avec et sans le distinct, les résultats sont différents selon les modifications de ma table relation pour un identifiant (user).

    Je ne devrais obtenir que 2 lignes maximum, 1 par membre
    et une ligne minimum, si le lien est affecté au 2 membres

    J'obtiens actuellement 9 lignes et dans ma table relation, j'ai 8 lignes ^^
    et je peux même obtenir toute l'ensemble de mes liens ?!?!

    "Si vous voulez le max hits par user", en fait je voudrais le max hits par lien en resultat, j'ai essayé de me reposer le problème et d'obtenir la solution littérale :

    1 - Je lis et récupère le hits pour chaque liens
    2 - de ce résultat, je ne prend que les liens présents dans la table relation
    3 - de ce résultat, je ne prend que les liens dont le user est VIP (type = 2)
    4 - J'ai a priori l'unicité des liens que je voudrais triés ...

    Je ne vois pas dans votre requête le problème, le problème provient a partir du moment ou je modifie pour le user 2 dans la table relation, pour affecté un autre lien présent chez le user 1 ?

    Merci de vos précisions sur les modifications à effectuer

  8. #8
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Solution trouvé sur : http://forum.webrankinfo.com/mysql-g...163159-15.html

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT l.lien,l.hits 
    FROM liens l INNER JOIN relation r ON (r.lien = l.lien)
    WHERE 
      (r.user,l.hits) 
    IN 
      (
        SELECT u.userid,MAX(l.hits) AS total FROM users u
        INNER JOIN relation r ON (r.user = u.userid)
        INNER JOIN liens l ON (l.lien = r.lien)
        WHERE u.type = 2
        GROUP BY u.userid
      )

    Merci de votre aide qui m'a permis de mieux comprendre certaine chose.

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

Discussions similaires

  1. [MySQL-5.6] Problème de requête (COUNT, GROUP BY) sur plusieurs tables
    Par alexisavenel dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/10/2014, 12h47
  2. Réponses: 2
    Dernier message: 17/03/2014, 11h18
  3. Group by sur plusieurs table de même squelette
    Par hackrobat dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 13/03/2006, 19h41
  4. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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