选择组合Join& amp;计数

时间:2013-09-11 13:49:22

标签: php mysql sql

我正在使用php和mysql构建一个简单的问题/回复系统 我要做的是显示所有问题,包括他们的回复计数和最后回复的时间戳 这是我的表的结构:

Table 'Discussion':  
id | title | description | user_id | timestamp
--------------------------------------------------------------------------------
Table 'Reply':  
id | reply_text | user_id | discussion_id | timestamp

我现在正在做的是选择讨论并让回复计算如下:

SELECT 
     d.*,
     count(dr.id) AS replies_count
FROM discussion d
LEFT JOIN discussion_reply dr ON d.id = dr.discussion_id
GROUP BY d.id

这会返回id | title | description | user_id | timestamp | replies_count

之类的行

然后(通过PHP)我循环结果并查询数据库以获得每个讨论的最新(最大)时间戳的回复。
因此,对于第一个查询返回的每一行,都会生成一个新查询。

有没有办法获得我需要的所有信息,只需执行一个查询? 就像修改我的初始查询一样,它返回:

  

id |标题|描述| user_id |时间戳| replies_count |   latest_reply_timestamp

提前谢谢

1 个答案:

答案 0 :(得分:1)

以下声明将在每次讨论中为您提供最新回复。

SELECT  a.id, a.title, a.description, a.user_id, a.timestamp,
        b.id ReplyID, b.reply_text, b.user_id, b.discussion_id, 
        b.timestamp ReplyTimestamp,
        COALESCE(c.totalReplies, 0) TotalReplyCount

FROM    Discussion a
        LEFT JOIN
        (
            SELECT  a.*
            FROM    Reply a
                    INNER JOIN
                    (
                        SELECT  discussion_id, MAX(timestamp) timestamp
                        FROM    Reply
                        GROUP   BY discussion_id
                    ) b ON  a.discussion_id = b.discussion_id AND
                            a.timestamp = b.timestamp
        ) b ON  a.discussion_id = b.discussion_id
        LEFT JOIN
        (
            SELECT  discussion_id, COUNT(*) totalReplies
            FROM    Reply
            GROUP   BY discussion_id    
        ) c ON a.discussion_id = c.discussion_id