Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 29
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    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 :
    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 Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2012
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2012
    Messages : 764
    Points : 1 374
    Points
    1 374

    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 :
    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

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    Par défaut

    Merci pour la précision mais j'ai beau mettre

    Code sql :
    GROUP BY id_article, article_titre, type_article_intitule

    puis

    Code sql :
    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 Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2012
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2012
    Messages : 764
    Points : 1 374
    Points
    1 374

    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.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    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
    Expert Confirmé Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    mai 2002
    Messages
    2 348
    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 348
    Points : 3 160
    Points
    3 160

    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 :
    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 confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    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
    Expert Confirmé Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    mai 2002
    Messages
    2 348
    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 348
    Points : 3 160
    Points
    3 160

    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 :
    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 confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    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
    Expert Confirmé Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    mai 2002
    Messages
    2 348
    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 348
    Points : 3 160
    Points
    3 160

    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
    Expert Confirmé Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    mai 2002
    Messages
    2 348
    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 348
    Points : 3 160
    Points
    3 160

    Par défaut

    Je connais avec les IN, EXIST ou MATCH mais j'ai vu et tu peux tjs essayé:
    Code sql :
    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 confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    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
    Expert Confirmé Avatar de ericd69
    Homme Profil pro Eric Dureuil
    Développeur informatique
    Inscrit en
    avril 2011
    Messages
    1 897
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Dureuil
    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 897
    Points : 3 207
    Points
    3 207

    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 confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    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
    Expert Confirmé Avatar de ericd69
    Homme Profil pro Eric Dureuil
    Développeur informatique
    Inscrit en
    avril 2011
    Messages
    1 897
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Dureuil
    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 897
    Points : 3 207
    Points
    3 207

    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 confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    Par défaut

    Du genre :

    Code sql :
    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
    Expert Confirmé Avatar de ericd69
    Homme Profil pro Eric Dureuil
    Développeur informatique
    Inscrit en
    avril 2011
    Messages
    1 897
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Dureuil
    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 897
    Points : 3 207
    Points
    3 207

    Par défaut

    donc ça devrait le faire:
    Code sql :
    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 confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    Par défaut

    Not beter :



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

    Code :
    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 Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2012
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2012
    Messages : 764
    Points : 1 374
    Points
    1 374

    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 :
    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.

  20. #20
    Membre confirmé
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    627
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 627
    Points : 293
    Points
    293

    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 :
    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •