8791 sujets

Développement web côté serveur, CMS

Bonjour tout le monde,

J'ai une double question à vous poser.
Voici la manière dont je récupère le dernier message posté de chaque sujet de mon "forum", de manière chronologique. Le système fonctionne très bien.

$res = mysql_query('
SELECT *
FROM discussion 
WHERE id IN 
(SELECT MAX(id) FROM discussion GROUP BY sujet ORDER BY MAX(id) DESC) 
ORDER BY id DESC LIMIT ' . intval($premierMessageAafficher) . ', ' . intval($nombreDeMessagesParPage) . '') 
or die(mysql_error());


Première question : cette requête est-elle optimisable ?
Seconde question :
J'ai une seconde table, appelée discussion_options, celle-ci contient des données membres : les sujets consultés par le membre et le dernier message consulté sur chaque sujet consulté.
Je souhaite inclure dans le listing des derniers messages de chaque sujet, une icone lu/non lu. Jusqu'à présent j'ai fait une requête sur la table discussion_options, à l'intérieur de la boucle de la précédente requête. Ma question donc : peut-on faire une seule et unique requête pour tout ça ?

Merci d'avance pour votre aide !
Modifié par Bertrand40 (21 May 2010 - 09:48)
salut bertrand40,
Personnellement je ne suis pas un expert en sql mais ta requête me semble bonne...
Pour le reste, peut être qu'en posant la question dans la bonne section tu aurais plus de réponses... ?
Le tout en une seule requête, ça devrait donner quelque chose comme ça:


SELECT
    *,
    IF(id = (SELECT cleEtrangereVersDernierMessage FROM discussion_options WHERE discussionOptionsSujet = discussion.sujet),1,0) AS UnPourLuZeroSinon
FROM
    discussion  
WHERE
    id IN (SELECT MAX(id) FROM discussion GROUP BY sujet ORDER BY MAX(id) DESC)
  
ORDER BY id DESC
LIMIT ' . intval($premierMessageAafficher) . ', ' . intval($nombreDeMessagesParPage) 



Il me manque quelques infos sur la structure de discussion_options, alors je ne peux qu'imaginer comment une telle table peut être construite ^^
Bonjour Pax,

Voici grosso modo comment ça se structure :

table discussion :
id | pseudo | sujet | message | date/heure | etc...

table discussion_options :
id | pseudo | sujet_consulte | com_consulte | suivi_sujet

Donc jusqu'à présent voici ce que j'ai fait :


$res = mysql_query(' 
SELECT * 
FROM discussion  
WHERE id IN  
(SELECT MAX(id) FROM discussion GROUP BY sujet ORDER BY MAX(id) DESC)  
ORDER BY id DESC LIMIT ' . intval($premierMessageAafficher) . ', ' . intval($nombreDeMessagesParPage) . '')  
or die(mysql_error());


while ($retour = mysql_fetch_assoc($res))
{
//récupération des params membres
$res = mysql_query(' 
SELECT * 
FROM discussion_options  
WHERE (pseudo = "' . mysql_real_escape_string($_SESSION['pseudo']) . '" AND sujet_consulte = "' . mysql_real_escape_string($retour['sujet']) . '")  
')  
or die(mysql_error());
}


Je ne sais pas si on est dans le cas d'une jointure, je ne vois pas le truc en fait. Et en plus j'ai aucune idée de la lourdeur de ce que je fais.

Merci pour ton aide.
Attention, si les colonnes sujet et sujet_consulte sont des champs textes et pas des clés étrangères vers une table de sujets, il peut être délicat de faire le lien lorsque des sujets sont identiques, à moins que ça ne puisse pas arriver...
Salut, je suis toujours sur cette fameuse requête.
J'ai lu et visionné quelques tutos sur les jointures SQL et a priori c'est pas possible en effet.
Si vous me dites que la première requête est correcte alors c'est que le sujet doit être résolu.
Merci.
Modifié par Bertrand40 (06 Jun 2010 - 12:30)