0

フォーラムの場合、 、 、 などの追加のリンクされた情報とともに を取得したいと考えてforumTopicいます。lastPostDatelastPostUserNamestarterUserName

と で問題が発生しlastPostUserNameますstarterUserName。にリンクされた投稿が 1 つしかない場合、forumTopic正しく機能しているように見え、両方lastPostUserNamestarterUserName埋められます。トピックに複数の投稿がリンクされている場合、 のみがstarterUserName埋められ、lastPostUserNameNULL

データベースの構造は、がのformCategory数を持ち、が にリンクされています。formTopicforumTopicforumPostforumPostuser

SELECT forumTopic.*, 
        COUNT( forumPost.id ) AS postCount,  
        MAX(forumPost.date) AS lastPostDate,
        (SELECT name FROM user AS u1 WHERE u1.id = forumPost.posterUserId AND forumPost.date = MAX(forumPost.date) )
                                AS lastPostUserName,
        (SELECT name FROM user AS u2 WHERE u2.id = forumPost.posterUserId AND forumPost.date = MIN(forumPost.date) )
                                AS starterUserName

FROM forumCategory
LEFT JOIN forumTopic ON forumCategory.id = forumTopic.forumCategoryId 
LEFT JOIN forumPost ON forumPost.forumTopicId = forumTopic.id 

WHERE forumCategory.rewrittenName='someforumcategory' 
        AND forumCategory.active='Y' 
        AND forumTopic.active='Y' 
        AND forumPost.active='Y' 

GROUP BY forumTopic.id
ORDER BY forumPost.date ASC
4

1 に答える 1

1

これを試して

SELECT forumTopic.*, 
        innerv.*, 
        (SELECT name FROM user AS u1 WHERE u1.id = innerv.first_user)
                                AS startedUserName,
        (SELECT name FROM user AS u2 WHERE u2.id = innerv.last_user )
                                AS lastUserName
FROM forumTopic
LEFT JOIN forumCategory ON forumCategory.id = forumTopic.forumCategoryId 
LEFT JOIN (
SELECT forumTopicId, MAX(date) AS LAST_POSTED_dATE, MIN(date) as FIRST_POSTED_DATE,
SUBSTRING_INDEX(
GROUP_CONCAT(posterUserId ORDER BY date),
',',
1
) as first_user,
SUBSTRING_INDEX(
GROUP_CONCAT(posterUserId ORDER BY date),
',',
-1
) as last_user, count(1) as posts_under_topic
FROM forumPost where forumPost.active='Y' 
GROUP BY forumTopicId ) innerv ON innerv.forumTopicId = forumTopic.id 
WHERE forumCategory.rewrittenName='someforumcategory' 
        AND forumCategory.active='Y' 
        AND forumTopic.active='Y' 

サブクエリ (innerv) は、アクティブなレコードをフィルター処理し、トピック ID によってフォーラムポストのレコードをグループ化します。

于 2012-06-06T14:16:35.097 に答える