Comment faire ?

Mammouth du PHP | 1776 Messages

16 oct. 2006, 14:30

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

Eléphant du PHP | 193 Messages

16 oct. 2006, 14:50

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?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 oct. 2006, 15:08

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 )

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 1776 Messages

16 oct. 2006, 15:10

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) ?

Eléphant du PHP | 193 Messages

16 oct. 2006, 15:13

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 :o )

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

16 oct. 2006, 15:13

SELECT MAX( id_sujet ), sujet, texte FROM message GROUP BY id_sujet
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 oct. 2006, 15:14

Qu'est ce qu'il veut le monsieur ?! :-s :lol:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

16 oct. 2006, 15:39

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à :)

Mammouth du PHP | 1776 Messages

16 oct. 2006, 15:58

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 ^^

Mammouth du PHP | 1776 Messages

17 oct. 2006, 09:42

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 :
Image

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...

Eléphant du PHP | 193 Messages

17 oct. 2006, 10:09

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.

Mammouth du PHP | 1776 Messages

17 oct. 2006, 10:16

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...

Eléphant du PHP | 193 Messages

17 oct. 2006, 10:34

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...
Modifié en dernier par Vikchill le 17 oct. 2006, 10:46, modifié 2 fois.

Mammouth du PHP | 1776 Messages

17 oct. 2006, 10:45

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 ;-)

Eléphant du PHP | 193 Messages

17 oct. 2006, 10:55

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 :(