Page 1 sur 2
Comment faire ?
Posté : 16 oct. 2006, 14:30
par DocType
Bon les gars, je planche sur une question là, ça doit être simple mais bon...
J'ai trois tables:
- table messages qui contient du texte et un id rattaché à un sujet
- table sujets qui contient le titre du sujet, l'id de l'admin, l'id du sujet et l'id du posteur
- table admin, relié à la table sujets par l'id admin.
Le but de la mavoeuvre est de selectionner le dernier message laissé sur chaque sujet (grâce à l'id autoincrementé des messages)...C'est peut être tout simple mais je galère.
Merci d'avance
Posté : 16 oct. 2006, 14:50
par Vikchill
Le dernier message, c'est celui qui a le plus grand id non? Donc un MAX de l'id du message groupé par id de sujet?
Posté : 16 oct. 2006, 15:08
par Truc
Comme le dit Vikchill un MAX et un GROUP BY
Tu dois donc soit :
1. faire deux requêtes une pour les MAX une pour les messages correspondant
2. Une requête imbriquée, quelque chose dans le style :
Code : Tout sélectionner
SELECT m. *
FROM message m LEFT JOIN sujets s
ON m.id_sujet = s.id_sujet
WHERE m.id_sujet IN (
SELECT MAX( id_sujet ) FROM message GROUP BY id_sujet
)
Posté : 16 oct. 2006, 15:10
par DocType
ouep, ca j'ai réussi à faire, mais si je veux sélectionner d'autres champs du message je fais comment dans ce max(id) ?
Posté : 16 oct. 2006, 15:13
par Vikchill
Soit plus clair, là je crois qu'on a répondu à ta question de départ, dis-nous ce qui manque dans cette requête (tu as quand même un SELECT * de message dedans

)
Posté : 16 oct. 2006, 15:13
par mere-teresa
SELECT MAX( id_sujet ), sujet, texte FROM message GROUP BY id_sujet
Posté : 16 oct. 2006, 15:14
par Truc
Qu'est ce qu'il veut le monsieur ?!

Posté : 16 oct. 2006, 15:39
par Ryle
Pour le group by, ce sont les champs qui sont groupés qu'il faut utiliser

SELECT MAX( id_sujet ), sujet, texte FROM message GROUP BY sujet, texte
Ceci dit, tu peux également faire un simple "SELECT ...", un "ORDER BY id DESC" pour avoir le dernier en tête et un "LIMIT 0, 1" pour ne ramener que celui là

Posté : 16 oct. 2006, 15:58
par DocType
ba justement, je fais cette requete, mais ca me rapporte tout sauf le texte de mon max(id)... je suis en GROUP By etc...
bizarre
Jvous tiens au courant mes z'amours ^^
Posté : 17 oct. 2006, 09:42
par DocType
Youpla boum
ma requête :
Code : Tout sélectionner
SELECT t . * , MAX( m.id ) , m.message
FROM administrateurs AS a, tickets AS t, messages AS m
WHERE a.niveau = '1'
AND a.etat = '1'
AND t.etat = '1'
AND t.id = m.id_ticket
GROUP BY t.id
LIMIT 0 , 30
Problème : Les m.message ne correspondent pas au m.id ...
Illustration :
Que faire dans ma requête ? je peux tout de même pas faire une clause where sur un max(id ) ???
J'ai pensé à une requête imbriquée, zen pensez quoi ?
[ EDIT ] requête imbriquée pas possible car elle renverrait plus d'un champ...
Posté : 17 oct. 2006, 10:09
par Vikchill
Tu peux pas faire de where sur le max(id), mais tu peux faire un WHERE id = (SELECT MAX(id) ... ), je sais pas si ça te servira.
Posté : 17 oct. 2006, 10:16
par DocType
Code : Tout sélectionner
SELECT t.*,m.id,m.message FROM administrateurs As a, tickets As t, messages As m WHERE a.niveau='1' AND a.etat='1' AND t.etat='1' AND t.id=m.id_ticket AND m.id= (SELECT MAX(m.id) FROM messages As m, tickets As t WHERE t.id=m.id_ticket GROUP By m.id)
Idem, ça me renvoi plusieurs champs donc bai*é...
Pour ceux qui m'aideraient à résoudre mon problème, c'est une reqête qui permet de "sélectionner le dernier message de chaque ticket" où tickets et la table de tickets et messages la table de messages...
Posté : 17 oct. 2006, 10:34
par Vikchill
Code : Tout sélectionner
SELECT t.*,m.id,m.message FROM administrateurs As a, tickets As t, messages As m WHERE a.niveau='1' AND a.etat='1' AND t.etat='1' AND t.id=m.id_ticket AND m.id= (SELECT MAX(m.id) FROM messages As m, tickets As t WHERE t.id=m.id_ticket GROUP By m.id)
Idem, ça me renvoi plusieurs champs donc bai*é...
Oui, forcément ça peut marcher de cette façon. Tu peux filer un petit jeu d'essai que je tente ma chance dans ma base MySQL de test?
A l'aveugle et instinctivement:
Code : Tout sélectionner
SELECT t.*, m.id, m.message
FROM administrateurs As a, tickets As t, messages As m
WHERE a.niveau='1'
AND a.etat='1'
AND t.etat='1'
AND t.id=m.id_ticket
AND m.id= (SELECT MAX(m.id) FROM messages n WHERE n.id=t.id)
GROUP BY t.id
Je sais que ça a l'air tordu...
Posté : 17 oct. 2006, 10:45
par DocType
Non, toujous pas... la requête bien mais seulement ceux où l'id de ticket ) l'id du message.
J'ai quand même trouvé la solution au problème en grattant à la porte de phpbb ! J'ajoute dans ma table tickets (les sujets) une variable que je vais updater au fur et à mesure. Celle ci s'appelle last_post_id qui comme la traduction française le signale, contient l'identifiant du derneire message qui lui est associé.
Toutefois si quelqu'un trouve la solution sans cette variable, je suis à l'écoute

Posté : 17 oct. 2006, 10:55
par Vikchill
Non, toujous pas... la requête bien mais seulement ceux où l'id de ticket ) l'id du message.
Alors là il y a une forte odeur de boulettisation de ma part... je crois que je me suis embrouillé dans les alias de la requête imbriquée:
Code : Tout sélectionner
SELECT t.*, m.id, m.message
FROM administrateurs As a, tickets As t, messages As m
WHERE a.niveau='1'
AND a.etat='1'
AND t.etat='1'
AND t.id=m.id_ticket
AND m.id= (SELECT MAX(n.id) FROM messages n WHERE n.id_ticket=t.id)
GROUP BY t.id
En espérant que ça fonctionne :s Bon, tu as une solution de secours, mais j'aurais aimé qu'on trouve la réponse. Mon problème c'est que j'ai du mal à trouver la solution sans pouvoir manipuler les données
