Php 选择合并联接的行(&A);计数
我正在使用php和mysql构建一个简单的问答系统。Php 选择合并联接的行(&A);计数,php,mysql,sql,Php,Mysql,Sql,我正在使用php和mysql构建一个简单的问答系统。 我要做的是显示所有问题,其中包括他们的答复计数和最后一次答复的时间戳。 以下是我的表格结构: Table 'Discussion': id | title | description | user_id | timestamp -------------------------------------------------------------------------------- Table 'Reply': id | repl
我要做的是显示所有问题,其中包括他们的答复计数和最后一次答复的时间戳。
以下是我的表格结构:
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 | u id | timestamp | responses | u count
然后(通过PHP)我循环搜索结果并查询数据库,以获得每个讨论的最新(最大)时间戳回复。因此,对于第一个查询返回的每一行,都会进行一个新的查询 有没有一种方法可以通过执行一个查询来获取我需要的所有信息?
如修改我的初始查询,使其返回: id |标题|描述|用户id |时间戳|回复|计数| 最新回复时间戳
提前感谢以下声明将为您提供每次讨论的最新回复
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
谢谢回复@491243。首先想到的是,这似乎并没有回应任何讨论。它也不计算回复数量,但我认为这可以解决。非常感谢,我现在正在查看:)这就是@491243。。。工作就像一个魅力:)最后一个问题,这似乎有点“沉重”的性能思考。我认为这比我过去所做的(循环讨论并查询每个讨论的数据库)更值得花费开销,对吗?如果在表上设置了适当的索引,就不需要考虑性能
:)
但我更喜欢这种方式,而不是每次都对DB进行查询,因为DB连接成本很高。