8791 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

bilhackmac a écrit :

Donc l'astuce de cette petite requête, c'est qu'elle boucle sur elle même avec le 'LEFT JOIN'. Chaque enregistrement est donc lié sur un groupe lui correspondant (dans ce cas là, sur 'sujet'), puis chaque groupe est trié suivant un ordre de grandeur (un id, une date… (dans ce cas la 'idDansSujet')).

Ce processus permet d'obtenir une requête qui retourne beaucoup de résultat, mais seul les derniers (premiers si on inverse le signe de grandeur) résultats par groupe ont un id (ou n'importe quel autre champ) dans la table de bouclage qui vaut NULL.

Ansi avec 'WHERE table_de_bouclage.n_importe_quel_champ IS NULL' ont obtient le dernier enregistrement pour chaque groupe.

J'espère avoir été clair. Smiley lol


Salut ! Oui c'est clairement dit, mais pas clairement compris on va dire. Je vais prendre un stylo, une feuille, et essayer de comprendre car ta requête est diablement efficace..!

bilhackmac a écrit :
Bon je viens d'y jeter un œil, on peut lier les deux tables sur discussion.sujet = discussion_options.sujet_consulte.

Je suppose aussi que com_consulte est en fait l''id' de 'discussion' du dernier message vu pour un sujet pour un utilisateur. (je me trompe ?)

Maintenant la question est : quel résultat veux-tu obtenir ? cligne


En fait j'essaie de lister, dans le même tableau, les sujets consultés, les sujets suivis, et les sujets commentés, d'un membre (pour les besoins de son espace personnel). J'y arrive avec une suite de requêtes, mais ça donne une fois de plus une page extrêmement lourde à charger.

Je suis presque arrivé à une requête unique qui fait ce que je voudrais. Le problème étant le fait que l'intitulé des sujets non commentés n'apparait pas dans le listing.

Voici cette requête :


SELECT *
FROM `discussion_options` DO
LEFT JOIN `discussion` D 
ON D.`sujet` = DO.`sujetConsulte`
AND P.`login` = "' . mysql_real_escape_string($statut) . '"
WHERE DO.`login` = "' . mysql_real_escape_string($statut) . '" 
GROUP BY DO.`sujetConsulte`');


Je serai de retour en fin d'après-midi. Une fois de plus merci de t'attarder sur mon cas, c'est super sympa. Bonne journée. Smiley ravi

PS : Dis, est-ce que ce cours aborde les cas plus évolués que tu appliques ici ? http://sqlpro.developpez.com/cours/sqlaz/jointures/

Il faudrait que je progresse et les sites (genre sdz) n'abordent dans leurs tutos que des cas basiques que je sais faire.
Cette requête marche ? Tu ne reçois pas d'erreur avec 'P.`login`' ?

Autre point, il vaut mieux éviter de mettre des mots clefs en temps qu'alias de table ou alors les mettre entre ` (DO => `DO`)

Dis moi si cette requête retourne le résultat escompter. Mais je ne suis pas sûr car je ne comprends pas bien le rôle de 'com_consulte'

SELECT *
FROM `discussion` AS `Discussion`
LEFT JOIN `discussion_options` AS `DiscussionOption` ON (`Discussion`.`sujet` = `DiscussionOption`.`sujetConsulte` AND `Discussion`.`login` = `DiscussionOption`.`login`)
WHERE `Discussion`.`login` = "' . mysql_real_escape_string($login) . '"  
GROUP BY `DiscussionOption`.`sujetConsulte`


Pense aussi à mettre des index s'ils n'existe pas sur 'login' (les deux table), 'sujetConsulte'.



Concernant developpez.com, j'ai parcouru vite fait et cela me parait pas mal est plutôt complet, mais ce sont des structures de base, et, comme expliquer par MP pour les structures spécifique à tes besoins, c'est à toi de structurer tes données pour les faire ressortir selon tes besoins.
Re,

Je te réponds concernant com_consulte. Il est inutile ici en effet, mais m'est utile pour connaitre le statut lu/non lu d'un sujet par un membre (je récupère l'ID du dernier commentaire consulté par le membre de manière à ce que, s'il revient quelque temps plus tard et qu'un nouveau commentaire a été posté, la table indique que ce membre n'a pas lu les commentaires dont l'idDansSujet puisque l'idDansSujet en base est < au dernier id). Je ne suis pas sûr d'être très clair. En gros : si com_consulte < MAX(idDansSujet), alors le membre n'a pas lu le(s) dernier(s) commentaire(s) de ce sujet.

Dès que possible (tout à l'heure) je mets en application ce que tu m'as laissé.

Bon app'.
Modifié par Bertrand40 (21 Feb 2011 - 19:21)
Re-re !

Voilà, j'ai adapté la requête et voici ce que ça donne : elle est restreinte au cas du membre "Adeline".

http://www.pronostics-formule1.fr/test.php

Problème n°1 : La première ligne appelle un sujet "Les débuts", et merdouille. En modifiant la clause WHERE par WHERE `DiscussionOption`.`login` = "Adeline", ce "bug" est supprimé et il me semble que c'est plus correct (?? <== c'est une question Smiley ravi ) Ce problème intervient pour tous les membres. Problème dans la table sinon à ton avis ?

Problème n°2 : En revanche, ça ne résout pas le second problème. Dans le tableau que tu vois, seuls sont listés les sujets où Adeline a posté un message. Les autres, ceux qu'Adeline a consultés mais sans laisser de messages, n'apparaissent pas. Ils sont pourtant 2.

J'ai pas mal tripatouillé la chose et pourtant ce qu'on a là me semble logique puisque la jointure externe permet de renvoyer tous les enregistrements, y compris ceux dont la réponse est NULL.

Je m'en vais tripatouiller un peu plus.

PS :

Voici l'appel pour le tableau :


while ($retour = mysql_fetch_assoc($sql))
{
// formatage date en date française
$date = explode(' ',$retour['dateHeure']);
$heure = $date[1];
$date = explode('-', $date[0]);
$date = $date[2] . '/' . $date[1] . '/' . $date[0] . ' à ' . $heure;
				
// formatage texte de suivi
if ($retour['sujetSuivi'] == 1) $suivi = '<span class="green">actif</span>';
else $suivi = '<span class="orange">inactif</span>';
				
echo '
<tr>
	<td>' . $retour['sujet'] . '</td>
	<td>' . $date . '</td>
	<td>' . $retour['comConsulte'] . '</td>
	<td>' . $suivi . '</td>
	<td>' . $retour['login'] . '</td>
</tr>';
}

Modifié par Bertrand40 (21 Feb 2011 - 22:05)
Alors, problème 1 : normalement il faut appliquer ce filtre sur 'Discussion' car `DiscussionOption`.`login` est potentiellement NULL… mais bon on s'en fou vu que j'ai merder sur la jointure Smiley kc . Au final ta requête été bonne même si j'ai du mal à comprendre d'ou sort 'P.`login`'.

Problème 2 : il faut que dès que ton utilisateur visite un sujet pour la première fois, tu ajoutes un enregistrement dans ta table `discussion_options`.


Petite astuce pour la transformation d'une date

$date = strftime('%d/%m/%Y à %H:%M:%S', strtotime($retour['dateHeure'));
C'est bon, j'ai réussi, enfin ! En effet, le "P" était une boulette, alors effectivement ça n'allait pas fonctionner.. Voici le code :


$sql = mysql_query('SELECT * 
FROM `discussion_options` AS `DO` 
LEFT JOIN `discussion` AS `D` 
ON `D`.`sujet` = `DO`.`sujetConsulte` 
AND `D`.`login` = `DO`.`login` 
WHERE `DO`.`login` = "' . mysql_real_escape_string($login) . '"  
GROUP BY `DO`.`sujetConsulte`');


bilhackmac a écrit :


$date = strftime('%d/%m/%Y à %H:%M:%S', strtotime($retour['dateHeure'));

Merci pour cette astuce, la syntaxe est 4 fois plus courte...

Encore une fois, merci ! Je pense que j'ai pigé grosso modo les jointures externes, et il y en a pas mal dans le site. Alors tu sais ce qu'il me reste à faire... Smiley cligne

Salut !
Pages :