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

Langage SQL Discussion :

order by + group by


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut order by + group by
    Boujour a tous et a toute,
    J'ai une requête qui me pose problème sous mySQL,
    voici en gros la structure de ma base:
    source
    idSource
    titre
    annee
    qualite

    aectit
    idsource
    idauteur

    auteur
    idauteur
    nomAuteur


    data
    numdata
    Time// indique le timestamp en php du momment ou la donnée a été saisie
    idsource

    il y'a d'autre champs dans ces tables mais il ne sont pas utiles, ce que je voudrais, c'est obtenir pour un auteur donnée toute les source écrite par cette auteur, avec l'idsource et le titre et classé selon leur ordre de saisie.

    le problème que j'ai rencontré c'est qu'un idsource peut apparaitre plusieurs fois dans la table data donc j'ai pensé utilisé un group by mais j'ai pas trouvé la bonne syntaxe pour utiliser group by et order by a la fois.
    Si vous avez des idées, merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 215
    Points : 558
    Points
    558
    Par défaut
    Le order by se met normalement après le group by. Pas de problèmes particuliers à utiliser les deux ensemble.
    Tu peux aussi préciser un ordre dans le group by sous la forme :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    group by field_name [asc / desc]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    voila la requète que j'ai effectué:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select DISTINCT(source.IDSOURCE), TITRE, QUALITE, source.ANNEE as annee, time 
    from source, auteur, aecrit, data 
    where source.idsource=aecrit.idsource and aecrit.idauteur=auteur.idauteur and source.idsource=data.idsource and auteur.designation like '%a%'
    group by source.idsource order by data.time desc ;
    sa ne marche pas : il n'arrive pas a faire l'order sur les dernier timestamp.
    je ne sais pas comment lui indiquer de prendre le plus grand timestamp pour chaque source dans la table data

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 215
    Points : 558
    Points
    558
    Par défaut
    Etrange...

    Une chose qui n'a p-e rien à voir, mais de mémoire quand on utilise un group by, ce n'est pas where (avant le group by) mais having (après le group by) qui doit être utilisé... non ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    j'ai essayé d'utiliser le having mais j'ai l'impression que les jointure ne marche pas avec cette commande. de toute façon je ne pense pas que sa ai un rapport direct avec mon problème. ou peu être que se, je suis complètement perdu...

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    C'est ton GROUP BY qui est faux.
    D'ailleurs il ne sert à rien car il n'y a pas de fonction d'agrégation.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Le probème c'est que si je ne le met pas il me sortira plusieurs fois la mème source dans la cas ou il y'a deux time différent pour la même source dans la table data, et sa c'est pas ce que je veux: une fois chaque source avec son time maximum mais je sais pas si c'est vraiment possible

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Si les données TITRE, QUALITE et ANNEE ne varient pas pour un même idsource, un simple max(time) vous suffira.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT source.IDSOURCE, TITRE, QUALITE, source.ANNEE AS annee, max(time)
    ...
    GROUP BY source.IDSOURCE, TITRE, QUALITE, source.ANNEE
    Sinon, il s'agit de faire une auto-jointure sur le time maximum de chaque idsource, question souvent traitée, par exemple ici :
    http://www.developpez.net/forums/d74...trements-jour/

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    effectivement c'est le cas: chaque source n'a qu'une année, qu'un titre et qu'une qualité, et ta méthode avec le max marche très bien même si j'admet ne pas très bien comprendre pourquoi. en tous cas Merci beaucoup je n'avais plus espoir. Un grand merci a tous et bonne journée

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Un peu de lecture si tu veux prendre le temps de comprendre :
    http://sqlpro.developpez.com/cours/sqlaz/ensembles/

    Sur ton exemple, on veut récupérer, pour chaque IDSOURCE, TITRE, QUALITE et ANNEE identiques la valeur maximum de la colonne time.
    On lui définit dans la clause GROUP BY la liste des colonnes sur lesquelles portent notre regroupement (IDSOURCE, TITRE, QUALITE et ANNEE), et dans le SELECT on précise ce qu'on doit tirer de la colonne "time" (ici, la fonction max nous renverra la valeur maximum pour chaque groupe, il en existe beaucoup d'autres).

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

Discussions similaires

  1. Tables temporaires, jointure, order by, group by
    Par ionesco dans le forum Requêtes
    Réponses: 24
    Dernier message: 04/11/2009, 14h41
  2. Order by + Group by
    Par Overstone dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/12/2008, 00h18
  3. Order By, Group By et First()
    Par timoth dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 20/02/2008, 13h58
  4. Association ORDER BY/GROUP BY...
    Par JeremieT dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/01/2006, 16h49
  5. requête order by + group by ?
    Par isa38 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/07/2005, 14h42

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