Précédent   Forum du club des développeurs et IT Pro > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/12/2012, 19h07   #1
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
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
Type de fichier : jpg order_1.jpg (39,4 Ko, 23 affichages)
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 19h30   #2
Exia93
Membre Expert
 
Homme
Étudiant
Inscription : avril 2012
Messages : 604
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 604
Points : 1 055
Points : 1 055
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
Exia93 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/12/2012, 20h55   #3
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
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
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 21h22   #4
Exia93
Membre Expert
 
Homme
Étudiant
Inscription : avril 2012
Messages : 604
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 604
Points : 1 055
Points : 1 055
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.
Exia93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 08h37   #5
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
Il me faut au final les 10 articles les plus consultés trié par type d'article.

Soit par exemple :

Images attachées
Type de fichier : jpg orderby2.jpg (31,4 Ko, 13 affichages)
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 10h05   #6
Fench
Expert Confirmé
 
Avatar de Fench
 
Homme
Chercheur en informatique
Inscription : mai 2002
Messages : 2 346
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 346
Points : 3 231
Points : 3 231
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)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 10h37   #7
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
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 ?
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h22   #8
Fench
Expert Confirmé
 
Avatar de Fench
 
Homme
Chercheur en informatique
Inscription : mai 2002
Messages : 2 346
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 346
Points : 3 231
Points : 3 231
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)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h30   #9
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
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
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h35   #10
Fench
Expert Confirmé
 
Avatar de Fench
 
Homme
Chercheur en informatique
Inscription : mai 2002
Messages : 2 346
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 346
Points : 3 231
Points : 3 231
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)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h47   #11
Fench
Expert Confirmé
 
Avatar de Fench
 
Homme
Chercheur en informatique
Inscription : mai 2002
Messages : 2 346
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 346
Points : 3 231
Points : 3 231
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)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h54   #12
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
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
Type de fichier : jpg orderby3.jpg (42,8 Ko, 11 affichages)
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 12h02   #13
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 802
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 802
Points : 3 096
Points : 3 096
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 12h05   #14
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
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
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 12h24   #15
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 802
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 802
Points : 3 096
Points : 3 096
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 13h11   #16
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
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
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 13h39   #17
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 802
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 802
Points : 3 096
Points : 3 096
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 13h46   #18
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
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
Type de fichier : jpg orderby4.jpg (34,4 Ko, 11 affichages)
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 14h08   #19
Exia93
Membre Expert
 
Homme
Étudiant
Inscription : avril 2012
Messages : 604
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 604
Points : 1 055
Points : 1 055
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.
Exia93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 14h12   #20
heretik25
Membre confirmé
 
Homme
Inscription : avril 2011
Messages : 603
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 603
Points : 256
Points : 256
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.
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h13.


 
 
 
 
Partenaires

Hébergement Web