Compte supprimé Posté 5 Janvier 2005 Posté 5 Janvier 2005 Salut, je sais que y'a des pros qui trainent par là J'ai un problème de requête mysql. Sur un site j'ai une table "sorties" (id, id_topo, date) Je voudrais selectionner les dix sorties les plus récentes (champ date) et ayant un champ id_topo distinct. Vous savez comment faire ??? Merci Je pense savir qu'il faudrait faire une jointure sur 2 tables sorties, mais je vois pas comment.....
Vincent Posté 5 Janvier 2005 Posté 5 Janvier 2005 a vue de nez , ca devrait peut etre ressembler a : select * from sorties order by date desc group by id_topo LIMIT 1, 10
Compte supprimé Posté 5 Janvier 2005 Auteur Posté 5 Janvier 2005 Non, car avec cette méthode, il est impossible de récupéter le champ id. Peut être en faisant une jointure, mais comment ??? ps : en plus tu as inversé le group by et le order by
Sarc Posté 5 Janvier 2005 Posté 5 Janvier 2005 impossible de récupérer le champs id ??? Depuis quand ? Je suis sur a 200% que ca le récupère aussi !
Compte supprimé Posté 5 Janvier 2005 Auteur Posté 5 Janvier 2005 Comment est fait le group by ?? Quels sont les champs id et date qui sont conservés ?? je voudrais la date maximum, et l'id correspondant... Pour la date, c'est simple, il suffit de faire max(date) mais pour l'id ?
Anonymus Posté 5 Janvier 2005 Posté 5 Janvier 2005 Qu'appelles tu un champ id_topo distinct ? (pour faire une requete sur les 2 memes tables, il suffit de faire : select t1.id,t2.id from table as t1,table as t2 par exemple. )
Compte supprimé Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 Merci, id_topo distinct veut dire qu'il doit être unique. exemple avec 3 lignes (id, id_topo, date): 1 1 12 (sortie n°1 associée au topo n°1 effectuée à la date du 12) 2 2 13 (sortie n°2 associée au topo n°2 effectuée à la date du 13) 3 1 10 (sortie n°3 associée au topo n°1 effectuée à la date du 10) Je voudrais que ça me sorte (la sortie n°3 est écrasée par la sortie n°1, car plus vieille) : 2 2 13 1 1 12 En faisant SELECT id, id_topo, max(date) as maxdate FROM sorties GROUP BY id_topo ORDER BY maxdate le champ id ne correspond pas au champ max(date). Par exemple je peux avoir (ce que je ne veux pas) comme résultat : 2 2 13 3 1 12 J'ai bien pensé faire une jointure mais comment : visiblement j'ai pas le droit de mettre s1.date=s2.max(date) car max(date) est inconnu dans s2 SELECT s1.id, s2.id_topo, s2.max(date) as maxdate FROM sorties as s1, sorties as s2 WHERE ??? GROUP BY s2.id_topo ORDER BY maxdate Je vois pas là... Et toi ??
Sarc Posté 6 Janvier 2005 Posté 6 Janvier 2005 Je ne sais pas comment est fait ta table, mais je pense que ca devrait marcher : SELECT id, id_topo, max(date) as maxdate FROM sorties GROUP BY id_topo ORDER BY maxdate DESC Comme ça, tu trieras tes dates de la plus récente a la plus vieille, au lieu du contraire... Ca devrait déjà être mieux
Compte supprimé Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 c'est exactement l'exemple que je donnais plus haut (sans le DESC, oubli de ma part), exemple qui ne marche pas car lors du GROUP BY, le champ id conservé n'est pas forcément celui qui correspond au max(date).... Je crais qu'il n'y ait aucune possibilité de le faire en une requête. P'têtre en deux ??
Anonymus Posté 6 Janvier 2005 Posté 6 Janvier 2005 Solution : SELECT s1.id, s2.id_topo, max(s2.date) as maxdateFROM sorties as s1, sorties as s2WHERE s1.id = s2.idGROUP BY s2.id_topo ORDER BY maxdate desc C'est bon ?
Compte supprimé Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 Merci .... mais non , la jointure s1.id = s2.id ne change rien au pb, ça donne exactement le même résultat que SELECT id, id_topo, max(date) as maxdate FROM sorties GROUP BY id_topo ORDER BY maxdate DESC ...
Anonymus Posté 6 Janvier 2005 Posté 6 Janvier 2005 C'est pas ce que tu as demandé ?? Je voudrais que ça me sorte (la sortie n°3 est écrasée par la sortie n°1, car plus vieille) :2 2 13 1 1 12
Compte supprimé Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 ?? Avec ton code j'obtiens 2 2 13 3 1 12 on voit que dans la deuxième ligne, l'id n'est pas le bon (c'est l'id de la sortie n°3, alors que c'est la date de la sortie n°1) Si tu veux je te file un bout de code sql et ce que j'attends? Peut être y verra tu plus clair...
Anonymus Posté 6 Janvier 2005 Posté 6 Janvier 2005 Et comme ceci ? SELECT id, id_topo, max(date) as maxdateFROM sortiesGROUP BY id_topoORDER BY id_topo desc,id asc
Compte supprimé Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 Non. La solution toute conne, puisque id est auto-incrément SELECT max(id), id_topo, max(date ) AS maxdateFROM coursesGROUP BY id_topoORDER BY maxdate DESC , id_topo DESC, id DESC Merci encore !
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant