Partage
  • Partager sur Facebook
  • Partager sur Twitter

Besoin d'un éclaircissement

Requête pour l'index d'un forum

    17 février 2012 à 2:58:05

    Bonjour à tous,

    J'ai posté il y a quelques temps pour un problème avec une requête similaire. Cette fois, j'en suis aux prises avec quelque chose qui se rend un peu plus creux. En fait, je suis en train de coder l'index de mon forum personnalisé et je rencontre une erreur. Je n'ai pas encore inséré le tout dans le site, mais je fais des tests de requêtes dans phpMyAdmin pour voir quels résultats j'obtiens.

    Alors, je vous explique un peu l'architecture de base de mon forum (pas en détail, juste les champs essentiels) :

    Table 'membres'
    id pseudo


    Table 'fcategs' (pour Forum CATEGorieS)
    id titre


    Table 'forums'
    id titre description catg


    Table 'topics'
    id titre forum_id


    Table 'messages'
    id auteur attachement date


    Et, simplement : messages > attachement = topics.id > topics > forum_id = forums.id > forums > catg = fcategs.id > fcategs
    Naturellement, chaque message identifie son topic parent, chaque topic son forum parent, chaque forum sa catégorie.

    Et maintenant, c'est au niveau de l'index que ça bloque. Je veux une seule requête pour capturer toutes les infos dans la BDD. Il y aura aussi un tri fait à partir de PHP pour organiser les forums et les catégories dans l'ordre. J'ai donc conçu une requête qui avait pour but de me renvoyer le tableau d'infos suivant :

    Table finale des résultats
    category_id category_name forum_id forum_name forum_description topic_count_in_forum msg_count_in_forum last_msg_id last_msg_topic_id last_msg_topic_title last_msg_author_id last_msg_author_name last_msg_date
    ID de la catégorie Nom de la catégorie ID du forum Nom du forum Description du forum Nombre de topics dans le forum Nombre de messages dans le forum ID du dernier message du forum ID du topic contenant le dernier message du forum Titre du topic contenant le dernier message du forum ID de l'auteur du dernier message du forum Nom de l'auteur du dernier message du forum Date du dernier message du forum


    L'ensemble de la requête fonctionne et celle-ci m'affiche bien les informations sur chaque forum, le compte de topics et de messages pour chaque forum ainsi que l'ID du dernier message du forum, mais les informations concernant le dernier message du forum sont inexactes ! Après vérification la base de données semble seulement me renvoyer des résultats aléatoires sur l'auteur et le topic.

    Voilà la requête que j'utilise :

    -- sélectionner
    SELECT
    
    -- forum / catégorie
    f.catg AS category_id,
    c.titre AS category_name,
    rt.forum_id AS forum_id,
    f.titre AS forum_name,
    f.description AS forum_description,
    
    -- statistiques rapides
    COUNT(topic_id) AS topic_count_in_forum,
    SUM(msg_count_in_topic) AS msg_count_in_forum,
    
    -- infos sur le dernier message
    MAX(last_msg_id) AS last_msg_id,
    m.attachement AS last_msg_topic_id,
    t.titre AS last_msg_topic_title,
    m.auteur AS last_msg_author_id,
    u.pseudo AS last_msg_author_name,
    m.date AS last_msg_date
    
    -- sous-requête sur les derniers messages de chaque topic
    FROM
    	(SELECT MAX(m.id) AS last_msg_id, m.attachement AS topic_id, COUNT(m.id) AS msg_count_in_topic, t.forum_id AS forum_id
    	FROM messages AS m
    	INNER JOIN topics AS t ON t.id = m.attachement
    	WHERE typef = 1
    	GROUP BY topic_id)
    AS rt
    
    -- jointure des infos pour la catégorie et le forum
    INNER JOIN forums AS f ON f.id = forum_id
    INNER JOIN fcategs AS c ON c.id = f.catg
    
    -- jointure des infos du dernier message
    INNER JOIN messages AS m ON m.id = last_msg_id
    INNER JOIN topics AS t ON t.id = m.attachement
    INNER JOIN membres AS u ON u.id = m.auteur
    
    -- groupage final
    GROUP BY forum_id
    

    Donc au début la sous-requête compte le nombre de messages et l'ID du plus récent dans chaque topic, ainsi que l'ID de chaque topic pour créer les groupes. Par la suite, dans la requête principale, je reprends cette table en regroupant les topics par forum et en retrouvant l'ID du message le plus récent dans chaque forum, en plus d'en profiter pour faire les comptes pour les autres statistiques. Enfin, avec des jointures, je récupère toutes les informations complémentaires sur chaque forum et sur chaque dernier message de celui-ci.

    Je sais bien que :
    • Je devrai remplacer le type de certaines jointures pour également voir les forums vides.
    • Dans un GROUP BY, il faut mentionner tous les champs qu'on sélectionne. Mais comme MySQL est permissif, j'en ai convenu de limiter au plus possible les termes, que j'ajouterai plus tard. À moins que cela puisse résoudre le problème.
    Je demande aussi à ceux qui ont seulement envie de critiquer la raison pour laquelle je code mon propre forum, pour me suggérer de meilleurs SGBD ou pour toute autre critique non-constructive qui ne mènera pas à la résolution de ce sujet de ne pas poster (ça arrive sur certains forums, mais je suis heureux que les Zér0s qui m'ont aidé la dernière fois ici étaient très pertinents).

    J'espère avoir été assez clair au sujet de mon problème et que le code que je vous présente est lisible. N'hésitez pas à demander pour des informations supplémentaires.

    Je vous remercie chaleureusement de votre aide :)
    • Partager sur Facebook
    • Partager sur Twitter
    Ciphered - Développeur sur Factus Scribo - Présentation de notre projet
      17 février 2012 à 18:58:52

      Re,

      C'est justement parce que mySQL est permissif, qu'il t'envoie un tuple aléatoire pour boucher les trous....

      ++
      • Partager sur Facebook
      • Partager sur Twitter
        17 février 2012 à 21:27:37

        Matérialise les nombre de messages, topics, dernier post, etc... dans une colonne des tables concernées.
        • Partager sur Facebook
        • Partager sur Twitter

        Besoin d'un éclaircissement

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown