Group By ?

Résolu
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012 - 29 sept. 2007 à 17:36
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012 - 8 oct. 2007 à 15:23
Bonjour, comme précisé par la rubrique choisie, ma question est à propos du fonctionnement de MySQL disons.

Voila :

en gros et pour faire simple, j'ai deux tables, une news et une texte.
les deux ayant des clés primaires, la table texte à une clé étrangère/secondaire/je ne sais plus comment on l'appelle (désolé je n'ai pas revu de théorie depuis 1 an).

                                     | textes |
| news |                          |numero|
|numero|(1,1)<===(1,n) |numero_s|
|...|                                 |....|

(pas facile à dessiner)(si jamais j'ai inversé les cardinalités, désolé pareil c'est loin)
En fait, la table news (les news d'un site en fait) ne contient pas ses textes, c'est textes qui les contient.
en gros donc, il peut y avoir plusieurs textes sur une seule news (si jamais la news a été modifiée), et donc j'aimerais récupérer uniquement la dernière en date.
Javais pensé à faire un limit 1 mais ca agis sur la requete complète et non sur une seule table. De même, j'ai pensé au group by, mais autant je sais que group by va me renvoyer un seul texte par news (group by textes bien sur), mais lequel ? Je n'ai rien trouvé à ce sujet. Le premier qui apparait dans le classement ? Le dernier ? aléatoire ?

Existe-il une instruction qui pourrait spécialement me servir dans ce genre de cas (en dehors de celles-citées) ?

<hr size="2" width="100%" />  Qui ne tente rien...

  Ne risque pas d'avoir grand chose !!!

<hr siz="" />

5 réponses

mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
8 oct. 2007 à 15:23
En fin de compte c'est exactement ce que j'avais fait au départ, mais sans pouvoir vérifier si la ligne renvoyée est bien "la plus haute" ?

Par contre on m'a donné une autre réponse :

SELECT n.numero, t1.texte, t1.date
FROM news n, textes t1
WHERE n.numero=t1.numero_s
AND t1.date= (SELECT MAX(t2.date) FROM textes t2 WHERE t2.numero_s=n.numero)

A vrai dire je n'y avait pas pensé ! Mais ca semble très bien marché (d'ailleurs pourquoi cela ne marcherait-il pas... ?)

Enfin merci à vous pour s'êtrepenché sur mon problème !

<hr size="2" width="100%" />  Qui ne tente rien...

  Ne risque pas d'avoir grand chose !!!

<hr siz="" />
3
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
29 sept. 2007 à 17:47
J'ai oublié de préciser que je peux sans soucie déterminer quel texte choisir grace au champ date !

<hr size="2" width="100%" />  Qui ne tente rien...

  Ne risque pas d'avoir grand chose !!!

<hr siz="" />
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
29 sept. 2007 à 18:33
Salut

Si tu as un champ date tu peux faire une requete du type

select  * from Texte
order by [date] desc
limit 1

Sinon tu peux surement y arrive avec un group by

Bon courage
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
29 sept. 2007 à 19:19
En fait, le limit 1 marcherait si j'avais seulement une news a prendre, le but étant de récupérer toutes les news d'un coup ! (donc plusieurs news, mais chacune un seul texte, celui dont la date est la plus récente). C'est pour ca que j'ai pensé au group by, mais je ne trouve pas de doc assez précise dessus. Est-ce que j'ai un risque que l'enregistrement qui sort ne soit pas celui qui se trouve en haut de liste ?

<hr size="2" width="100%" />  Qui ne tente rien...

  Ne risque pas d'avoir grand chose !!!

<hr siz="" />
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
viry0ne Messages postés 12 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 13 avril 2010
8 oct. 2007 à 12:53
Lu'

Moi je verrais bien un ORDER couplé à un GROUP BY...
Tu order by date desc, pour avoir la plus récente en premier, puis tu group by, qui lui te renvoie la ligne 'la plus en haut'.
Apres tu execute plusieurs fois ta requete en t'assurant que tu obtient bien le résultat attendu, et roulez jeunesse.
0
Rejoignez-nous