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 :

ORDER BY récalcitrant


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut ORDER BY récalcitrant
    Bonsoir,

    Je n'arrive pas à obtenir le tableau que je souhaite à partir de ma requête. Je souhaiterais obtenir les articles les plus visités triés par groupe d'article.


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT count(*) as total, a.id_article,article_titre,type_article_intitule
    FROM pevtt_statistique a
    JOIN pevtt_article b ON a.id_article = b.id_article
    JOIN pevtt_article_type_article c ON b.id_article = c.id_article
    JOIN pevtt_type_article d ON c.id_type_article = d.id_type_article
     
    WHERE type_article_intitule != "nouvelle"
     
    GROUP BY id_article
    ORDER by total desc
    LIMIT 10

    Cette requête me ramène :



    J'ai beau rajouter dans le ORDER BY "type_article_intitule" en plus de "total" je n'arrive pas à lister les articles les plus visités par groupe avec un tri par type.

    Une idée sur la question ?

    Merci.
    Images attachées Images attachées  

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonsoir,

    quand tu utilise GROUP BY tu doit spécifier toutes les colonnes utilisées dans le select sauf celle qui utilise une fonction d'agrégat (somme, moyenne, comptage, ...),

    sinon tu aura des valeurs aléatoires dans les colonnes non spécifié qui n'utilise pas de fonction d'agrégat.

    Donc ta requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT count(*) as total, a.id_article,article_titre,type_article_intitule
    FROM pevtt_statistique a
    JOIN pevtt_article b ON a.id_article = b.id_article
    JOIN pevtt_article_type_article c ON b.id_article = c.id_article
    JOIN pevtt_type_article d ON c.id_type_article = d.id_type_article
     
    WHERE type_article_intitule != "nouvelle"
     
    GROUP BY id_article, article_titre, type_article_intitule
    ORDER by total desc
    LIMIT 10
    une réponse vous a permis d'avancer ?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Merci pour la précision mais j'ai beau mettre

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY id_article, article_titre, type_article_intitule

    puis

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER by total desc, type_article_intitule

    Je n'ai pas un tri par groupe homogène, càd, tous les tests puis toutes les balades... qui sont dans les 10 premiers articles visités

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Peut tu nous montrer le résultat que tu souhaite avoir avec les données que tu a données dans ton premier post (l'image) s'il-te-plaît.
    une réponse vous a permis d'avancer ?

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Il me faut au final les 10 articles les plus consultés trié par type d'article.

    Soit par exemple :

    Images attachées Images attachées  

  6. #6
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Désolé, j'avais fait un premier post puis refait le post qui était sur les mêmes propos qui en fait revenait à ce que disait Exia

    d'ou la modif suivante à essayer
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT count(*) as total, a.id_article as id,article_titre,type_article_intitule
    FROM pevtt_statistique a
    JOIN pevtt_article b ON a.id_article = b.id_article
    JOIN pevtt_article_type_article c ON b.id_article = c.id_article
    JOIN pevtt_type_article d ON c.id_type_article = d.id_type_article
    WHERE type_article_intitule != "nouvelle"
    GROUP BY id, article_titre, type_article_intitule
    ORDER by total desc
    LIMIT 10
    Qui devrait faire le bon group by mais j'ai peur sur le order by car je ne vois comment il peut le faire ... je cherche encore
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Merci pour la proposition Fench mais le ORDER BY ne retourne pas ce que je voudrais récupérer.

    Peut-être une sous requête ?

  8. #8
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    En relisant le group by, les nouvelles normes ont effectivement obligé à mettre dans le group by toutes les colonnes du select (sauf les agrégats) MAIS seule la première est utilisée pour le group by !!!

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY type_article_intitule, id, article_titre

    [Edit] par contre avec MySql, nous pouvons omettre {id, article_titre} et dans ce cas, il prendra n'importe qu'elle valeur pour ces champs -> voir Exia93

    [Edit] mais celà n'empêchera pas le groupement des types et donc tu n'auras pas ce que tu veux ... en effet, le chat se mort la queue ... une sous requête semble bienvenue
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Bien tenté mais le tri ne donne pas de meilleurs résultats étant donné qu'on a un total DESC qui fait le tri du plus grand au plus petit nombre de visite.

    Je pensais pas que ce serait si dur de trier la chose

  10. #10
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Oui, voir Edit de mon post précédent, alors va falloir isoler les type pour avoir ton affichage ...

    J'y réfléchi
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  11. #11
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Je connais avec les IN, EXIST ou MATCH mais j'ai vu et tu peux tjs essayé:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT * FROM (
       SELECT count(*) as total, a.id_article as id,article_titre,type_article_intitule
       FROM pevtt_statistique a
       JOIN pevtt_article b ON a.id_article = b.id_article
       JOIN pevtt_article_type_article c ON b.id_article = c.id_article
       JOIN pevtt_type_article d ON c.id_type_article = d.id_type_article
       WHERE type_article_intitule != "nouvelle"
       GROUP BY id, article_titre, type_article_intitule
       LIMIT 10) tableDesDix
    ORDER BY total desc
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Le résultat de la nouvelle tentative :



    On remarque que le tri par groupe se fait mais ce tri s'impose face au nombre de pages vues.
    Images attachées Images attachées  

  13. #13
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    tu devrais faire le group by dans une sous requête que tu joins au reste comme ça tu as un groupage sur une seule colonne et pas de sous groupages
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    salut,

    tu devrais faire le group by dans une sous requête que tu joins au reste comme ça tu as un groupage sur une seule colonne et pas de sous groupages
    Un petit exemple siouplait

  15. #15
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    commences par mettre des alias sur toutes les tables et préfixe chaque colonne nommé avec



    on va commencer par les bonnes pratiques:
    jointure = alias et on préfixe avec toutes les colonnes pour savoir qui appartient à qui
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  16. #16
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT * FROM (
       SELECT count(*) AS total, a.id_article AS id,b.article_titre,d.type_article_intitule
       FROM pevtt_statistique a
       JOIN pevtt_article b ON a.id_article = b.id_article
       JOIN pevtt_article_type_article c ON b.id_article = c.id_article
       JOIN pevtt_type_article d ON c.id_type_article = d.id_type_article
       WHERE type_article_intitule != "nouvelle"
       GROUP BY id, b.article_titre, d.type_article_intitule
       LIMIT 10) tableDesDix
    ORDER BY total DESC

  17. #17
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    donc ça devrait le faire:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select e.total,b.article_titre,c.type_article_intitule
    from
    (
    	select count(*) as total,a.id_article as id
    	from pevtt_statistique a
    	group by ida
    ) e
    inner JOIN pevtt_article b ON e.id = b.id_article
    inner JOIN pevtt_article_type_article c ON b.id_article = c.id_article
    inner JOIN pevtt_type_article d ON c.id_type_article = d.id_type_article
    WHERE type_article_intitule <> "nouvelle"
    ORDER BY e.total DESC
    limit 10

    c'est <> pas != en sql
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  18. #18
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Not beter :



    Petites corrections du code précédemment proposé (alias et faute de frappe):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT e.total,b.article_titre,d.type_article_intitule
    FROM
    (
    	SELECT count(*) AS total,a.id_article AS id
    	FROM pevtt_statistique a
    	GROUP BY id
    ) e
    INNER JOIN pevtt_article b ON e.id = b.id_article
    INNER JOIN pevtt_article_type_article c ON b.id_article = c.id_article
    INNER JOIN pevtt_type_article d ON c.id_type_article = d.id_type_article
    WHERE d.type_article_intitule <> "nouvelle"
    ORDER BY e.total DESC
    LIMIT 10
    Images attachées Images attachées  

  19. #19
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    je ne sais pas si c'est moi qui t'es mal compris mais dans toutes les requêtes que l'on t'a données je vois :
    mais tu demande un trie seulement sur le type article,

    tu avait tenter dans un post précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY total DESC, type_article_intitule
    mais si tu enlève le trie sur total et que tu ne laisse que type_article_intitule cela ne répond pas à ton besoin ?

    La colonne total ne sera plus trier par contre.
    une réponse vous a permis d'avancer ?

  20. #20
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Sauf que je cherche les 10 articles les plus lu tout en ayant un tri sur le type d'article.

    En faisant :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY type_article_intitule

    Je me retrouve bien avec un tri des groupes mais je n'ai pas les 10 premiers articles les plus lu.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 12h02
  2. order by sur plusieurs tables
    Par Mad_Max dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/12/2003, 13h17
  3. Probleme avec un "order by"
    Par LineLe dans le forum ASP
    Réponses: 30
    Dernier message: 16/09/2003, 16h38
  4. ORDER BY
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/07/2003, 12h56
  5. ORDER BY dans un ordre inhabituel
    Par Riam dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/03/2003, 14h29

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