我正在用户页面上列出标记/类别。我想显示用户为每个标签发的帖子数。标签、贴子和贴子标签位于不同的表中。
困难在于,有两种职位。文章和评论。它们在同一张表中,但类型不同。”“问题”和“答案”。答案中的相关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“。我只是厌倦了很多要求改正的尝试。首先,它似乎是存储post标签的最佳方式,但现在这是一个噩梦。我的意思是,对我来说,用这个结构做这个似乎是不可能的。
最佳答案
您可以得到两个计数,即用户发布的答案数和问题数,这里的技巧是使用正确的连接语法,您将丢失用于连接的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 sum中,使用一些表达式将得到一个布尔值
从注释中编辑使用或在上一个联接中添加另一个条件,以便第一个条件将联接与标记关联的帖子,由于您的解释标签没有直接链接到答案,但是答案与他们的问题有相关的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