Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/06/2011, 14h56   #1
Futur Membre du Club
 
Homme
Étudiant
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 17
Points : 17
Par défaut Problème de GROUP BY

Bonjour,

J'ai quelques soucis la clause GROUP BY dans ma requête sous MySQL. En effet cette dernière semble occulter certains enregistrements ou alors j'ai compris un truc de travers. Mon but est donc de grouper tous mes titres et d'avoir le premier sous titre correspondant.

Voici ma requête sans GROUP BY :

Code :
1
2
3
4
5
6
7
SELECT article_id, a.titre, a.texte, ss_titre, lieu_id,d.date1, d.date2 
FROM RENSEIGNEMENTS r, DATES d, ARTICLES a 
WHERE r.date_id = d.id 
AND a.id = r.article_id 
AND (a.edition = 'NANCY' OR a.edition = 'NANCY-METZ' OR a.edition = 'NANCY-METZ-STRASB' OR a.edition = 'NANCY-METZ-STR-DIJON' OR a. edition = 'TTES EDITIONS') 
AND a.rubrique = 'MANIFESTATIONS' 
ORDER BY date1
Elle me retourne ceci (je n'affiche pas tous les enregistrements bien sûr) :



Maintenant avec un GROUP BY :

Code :
1
2
3
4
5
6
7
8
SELECT article_id, a.titre, a.texte, ss_titre, lieu_id,d.date1, d.date2 
FROM RENSEIGNEMENTS r, DATES d, ARTICLES a 
WHERE r.date_id = d.id 
AND a.id = r.article_id 
AND (a.edition = 'NANCY' OR a.edition = 'NANCY-METZ' OR a.edition = 'NANCY-METZ-STRASB' OR a.edition = 'NANCY-METZ-STR-DIJON' OR a. edition = 'TTES EDITIONS') 
AND a.rubrique = 'MANIFESTATIONS' 
GROUP BY a.titre
ORDER BY date1
Elle me retourne :



Vous notez donc que dans le cas des articles ayant plusieurs sous titres, les premiers sous titres n'apparaissent pas.
L'article des 750 ans de Pont à mousson par exemple : avec un GROUP BY il devrait avoir comme sous titre "Les actes fondateurs [...]" et non "Sons et lumières". De plus le mois de la date devrait être 05 etc... La requête n'est pas censé prendre le premier enregistrement pour compléter les autres colonnes après un GROUP BY ?

Si vous pouviez m'éclairer sur mon problème, merci.
Shinosha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h07   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 085
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 085
Points : 1 883
Points : 1 883
Bonjour,
Dans la norme SQL, toutes les colonnes renvoyées qui ne font pas l'objet d'une fonction d'aggrégation doivent être dans la clause GROUP-BY, ce qui n'est pas le cas dans ta requête.
Comment le moteur de la base sait-il quelle valeur garder pour les colonnes article_id, a.texte, ss_titre, lieu_id,d.date1, d.date2 ?

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h08   #3
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Il faudrait déjà utiliser la notation des jonctions qui suivent la norme actuelle (en fait depuis 1992 de mémoire).

c'est à dire INNER JOIN ....

ensuite il faudrait regarder dans les tutoriels les regroupements

là vous confondez avec le DISTINCT
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h11   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Citation:
Envoyé par Shinosha Voir le message
Mon but est donc de grouper tous mes titres et d'avoir le premier sous titre correspondant.
Le premier... par rapport à quoi ?
De quelle table les colonnes article_id, ss_titre et lieu_id proviennent-elles ?
__________________
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h28   #5
Futur Membre du Club
 
Homme
Étudiant
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 17
Points : 17
Citation:
Le premier... par rapport à quoi ?
De quelle table les colonnes article_id, ss_titre et lieu_id proviennent-elles ?
Par rapport à sa date1 en fait. Je veux en fait le premier sous titre et les premières dates pour chaque titre, et avoir tous les titres une seule fois. J'espère que j'ai réussi à me faire comprendre
Désolé j'ai zappé des alias :

Code :
1
2
3
4
5
6
7
SELECT a.titre, r.article_id , a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2 
FROM ARTICLES a INNER JOIN RENSEIGNEMENTS r ON a.id = r.article_id
INNER JOIN DATES d ON r.date_id = d.id 
WHERE (a.edition = 'NANCY' OR a.edition = 'NANCY-METZ' OR a.edition = 'NANCY-METZ-STRASB' OR a.edition = 'NANCY-METZ-STR-DIJON' OR a. edition = 'TTES EDITIONS') 
AND a.rubrique = 'MANIFESTATIONS' 
GROUP BY a.titre
ORDER BY date1
Citation:
Il faudrait déjà utiliser la notation des jonctions qui suivent la norme actuelle (en fait depuis 1992 de mémoire) [...] là vous confondez avec le DISTINCT
Corrigé pour les jointures, merci.
C'est ce que je me suis dit au début mais Distinct n'a absolument aucun impact sur la requête.

Citation:
Dans la norme SQL, toutes les colonnes renvoyées qui ne font pas l'objet d'une fonction d'aggrégation doivent être dans la clause GROUP-BY, ce qui n'est pas le cas dans ta requête.
Je ne suis pas sûr de comprendre, vous voulez dire qu'il faut que je mette toutes les colonnes (excepté celle par laquelle je veux grouper) dans la clause GROUP BY ?
Shinosha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 16h00   #6
Membre habitué
 
Homme Gaëtan
Développeur Oracle
Inscription : mai 2006
Messages : 117
Détails du profil
Informations personnelles :
Nom : Homme Gaëtan
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 117
Points : 115
Points : 115
Bonjour,

D'après ce que je comprend pour votre cas , après l'utilisation du group by vous voulez avoir la ligne ' Les 750...' en titre et ' Les actes fondateur ... ' en sous titre. Je ne pense pas que le group by soit la solution.

Je pense qu'il faudrait faire un truc comme ça

Code :
1
2
3
4
5
6
7
8
9
10
SELECT article_id, a.titre, a.texte, ss_titre, lieu_id,d.date1, d.date2 
FROM RENSEIGNEMENTS r, DATES d, ARTICLES a 
WHERE r.date_id = d.id 
AND a.id = r.article_id 
AND (A.EDITION = 'NANCY' OR A.EDITION = 'NANCY-METZ' OR A.EDITION = 'NANCY-METZ-STRASB' OR A.EDITION = 'NANCY-METZ-STR-DIJON' OR A. EDITION = 'TTES EDITIONS') 
AND A.RUBRIQUE = 'MANIFESTATIONS' 
AND D.DATE1=(SELECT MIN(D1.DATE1) FROM RENSEIGNEMENTS R1, DATES D1, ARTICLES A1 
WHERE R1.DATE_ID = D1.ID 
AND A1.ID = R1.ARTICLE_ID 
WHERE a1.titre=a.titre)
(dsl pas tester la requete j'ai pas les table)

En claire ça va prendre le titre/sous titre ayant la date1 la plus petite.

Si cela ne te va pas dans les sous titre alors il faudrait peut être numéroté des Ss titre
attila771 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 16h13   #7
Futur Membre du Club
 
Homme
Étudiant
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 17
Points : 17
A vrai dire cela fait exactement ce que je voulais, merci

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT r.article_id, a.titre, a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2
FROM ARTICLES a
INNER JOIN RENSEIGNEMENTS r ON a.id = r.article_id
INNER JOIN DATES d ON r.date_id = d.id
WHERE (
a.edition = 'NANCY'
OR a.edition = 'NANCY-METZ'
OR a.edition = 'NANCY-METZ-STRASB'
OR a.edition = 'NANCY-METZ-STR-DIJON'
OR a.edition = 'TTES EDITIONS'
)
AND a.rubrique = 'MANIFESTATIONS'
AND d.date1 = ( 
SELECT MIN( d1.date1 ) 
FROM ARTICLES a1
INNER JOIN RENSEIGNEMENTS r1 ON a1.id = r1.article_id
INNER JOIN DATES d1 ON r1.date_id = d1.id
WHERE a1.titre = a.titre ) 
ORDER BY d.date1
Cela dit, c'est vraiment la seule façon de faire ? La requête est quand même imposante. Surtout que je vous ai montré que la partie défectueuse de l'UNION ALL
Shinosha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 16h20   #8
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Tu peux déjà remplacer tous les OR par un IN :
Code :
1
2
3
4
5
6
7
WHERE (
a.edition = 'NANCY'
OR a.edition = 'NANCY-METZ'
OR a.edition = 'NANCY-METZ-STRASB'
OR a.edition = 'NANCY-METZ-STR-DIJON'
OR a.edition = 'TTES EDITIONS'
)
équivaut à :
Code :
WHERE a.edition IN ('NANCY', 'NANCY-METZ', 'NANCY-METZ-STRASB', 'NANCY-METZ-STR-DIJON', 'TTES EDITIONS')
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/06/2011, 16h29   #9
Membre habitué
 
Homme Gaëtan
Développeur Oracle
Inscription : mai 2006
Messages : 117
Détails du profil
Informations personnelles :
Nom : Homme Gaëtan
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 117
Points : 115
Points : 115
Sinon, une autre solution, si tu as la possibilité, c'est d'ajouter une colonne dans la table ARTICLES, genre is_master, avec un flag Y/N. Cette colonne correspondra à la premier page que tu veux.

Au final ta requête donne :


Code :
1
2
3
4
5
6
7
8
9
 
SELECT r.article_id, a.titre, a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2
FROM ARTICLES a
INNER JOIN RENSEIGNEMENTS r ON a.id = r.article_id
INNER JOIN DATES D ON R.DATE_ID = D.ID
WHERE A.EDITION IN ('NANCY','NANCY-METZ','NANCY-METZ-STRASB','NANCY-METZ-STR-DIJON','TTES EDITIONS')
AND A.RUBRIQUE = 'MANIFESTATIONS'
AND A.is_master='Y' 
ORDER BY d.date1
attila771 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 27/06/2011, 16h36   #10
Futur Membre du Club
 
Homme
Étudiant
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 17
Points : 17
Malheureusement j'ai pas le droit

Bref, merci pour votre aide.
Shinosha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h57.


 
 
 
 
Partenaires

Hébergement Web