我在用户页面上列出标签/类别。我想显示用户为每个标签发布的帖子数。标签、帖子和帖子标签位于不同的表中。 困难在于,有两种帖子。帖子和评论。它们在同一张表中,但类型不同。 “问题和答案”。答案中的 related_id 是相关帖子的 ID。
我尝试了很多方法来解决,但无法让它发挥作用。
我的数据库结构: 对于标签:
tagid tag_name
对于帖子
id type(enum:"question","answer") related_id user_id
对于后置标签:
post_id tag_id
我尝试的代码如下:
$user_active_query = mysql_query("select p.id,
p.user_id,
pt.post_id,
count(pt.post_id),
pt.tag_id,
t.tagid,
t.tag_name
from posts p
inner join post_tags pt
inner join tags t
on p.id = pt.post_id
and pt.tag_id = t.tagid
where p.user_id = '$uid'
group by t.tagid");
while($useractive = mysql_fetch_array($user_active_query)) {
$user_active_counter = $useractive['count(pt.post_id)'];
echo "<a href='' class='btn btn-mini' style='margin:3px;'>".$useractive['tag_name']." (".$user_active_counter.")</a>";
}
用户 ID 在页面上给出。 “$uid”。我只是厌倦了很多尝试并要求更正。一开始它似乎是存储后置标签的最佳方式,但现在这是一场噩梦。我的意思是,对我来说,使用这种结构似乎不可能做到这一点。
最佳答案
您可以获得两个计数,即用户发布的答案数和问题数,这里的技巧还可以使用正确的连接语法,您缺少连接的 on 子句
SELECT
p.id,
p.user_id,
pt.post_id,
COUNT(pt.post_id) all_posts,
COALESCE(SUM(`type` = 'question')) questions,
COALESCE(SUM(`type` = 'answer')) answers,
pt.tag_id,
t.tagid,
t.tag_name
FROM tags t
LEFT JOIN post_tags pt ON(pt.tag_id = t.tagid)
LEFT JOIN posts p ON p.id = pt.post_id
WHERE p.user_id = '$uid'
GROUP BY t.tagid
注意在 mysql 中用一些表达式求和会得到一个 bool 值
Edit from comments 在您的上次加入中使用 OR 添加另一个条件,因此第一个条件将加入与标签关联的帖子,并且由于您的解释标签未直接与答案链接,但答案是链接的他们的问题与相关的 id 所以可以将每个答案的相关 id 加入标签 id 这样这样也可以获得答案的标签
SELECT
p.id,
p.user_id,
pt.post_id,
COUNT(pt.post_id) all_posts,
COALESCE(SUM(`type` = 'question')) questions,
COALESCE(SUM(`type` = 'answer')) answers,
pt.tag_id,
t.tagid,
t.tag_name
FROM tags t
LEFT JOIN post_tags pt ON(pt.tag_id = t.tagid)
LEFT JOIN posts p ON (p.id = pt.post_id OR p.related_id = pt.post_id)
WHERE p.user_id = '$uid'
GROUP BY t.tagid
关于php - 计算用户帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23664538/