PHP:计算项目并回显它们
我有三张桌子: 表1:主题表PHP:计算项目并回显它们,php,mysql,Php,Mysql,我有三张桌子: 表1:主题表 topic_id name date 1 blue 3/20/14 2 green 3/21/14 3 red 3/22/14 表2:答复表 reply_id topic_id message 12 1 bla bla 13 1
topic_id name date
1 blue 3/20/14
2 green 3/21/14
3 red 3/22/14
表2:答复表
reply_id topic_id message
12 1 bla bla
13 1 bla bla
14 2 bla bla
表3:评论表
comment_id topic_id message
50 1 bla bla
51 2 bla bla
如您所见,表2和表3通过名为topic_id的外键与表1相关
我使用以下查询选择并回显数据,如下所示:
$query ="SELECT name, COUNT(replies.topic_id) AS replies, COUNT(comments.topic_id) AS comments
FROM topics
LEFT JOIN replies
ON topics.topic_id = replies.topic_id
LEFT JOIN comments
ON topics.topic_id = comments.topic_id";
$r = mysqli_query($dbc, $query);
if (mysqli_num_rows($r) > 0) {
while ($num = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
echo {$num['name']};
echo {$num['replies']};
echo {$num['comments']};
}
}
如您所见,主题id编号1有两条回复和一条评论
但是,它输出两个答复和两条评论,如下所示:
name replies comments
blue 2 2
正确的结果应该是2条回复和1条评论
你能帮我吗
谢谢你可以试试
有帮助吗
select
t.name,
`replies`,
`comments`
from topics t
left join
(
select topic_id,count(reply_id) as `replies`
from replies
group by topic_id
)r
on r.topic_id = t.topic_id
left join
(
select topic_id,count(comment_id) as `comments`
from comments
group by topic_id
)c
on c.topic_id = t.topic_id
group by t.name
检查此处的演示尝试左连接的内部连接安装。如果不起作用,请尝试COUNTDISTINCTcomments.comment\u idtry从phpmyadmin或其他sql工具运行此查询并删除计数。我想您会看到注释id返回了两次,总共2次。由于查询的方式不同,它被返回了两次written@Anthony:我无法使用内部联接,因为如果主题没有回复和1条注释,输出将不会返回注释。此外,我尝试了DISTINCT函数,它只返回一个回复和一条注释,因为它将回复表和注释表中的topic_id 2识别为重复的。因此,它只返回一个回复和一条注释,而不是应该返回的两条回复和一条注释。@mituv16:我无法移动计数函数,因为如果我这样做,它将返回主题id值,如1,2,3。它不再计算了。正如您可以在提供的链接中测试它一样,返回的注释数是2,但对于主题名BLUE,不是1。所以,这仍然是不正确的。这就是我想要你帮忙的地方!@阿比克:此外,如果主题没有回复,只有1或2条评论,评论的数量将不会因为内部连接而打印出来。因此,这里不能使用内部联接。请参阅我上面的评论。
select
t.name,
`replies`,
`comments`
from topics t
left join
(
select topic_id,count(reply_id) as `replies`
from replies
group by topic_id
)r
on r.topic_id = t.topic_id
left join
(
select topic_id,count(comment_id) as `comments`
from comments
group by topic_id
)c
on c.topic_id = t.topic_id
group by t.name