php - 计算用户帖子

标签 php mysql

我在用户页面上列出标签/类别。我想显示用户为每个标签发布的帖子数。标签、帖子和帖子标签位于不同的表中。 困难在于,有两种帖子。帖子和评论。它们在同一张表中,但类型不同。 “问题和答案”。答案中的 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/

相关文章:

php - WordPress中SQL查询中的对角无序

php - XPATH检查当前节点的单个属性,然后返回许多属性

php - 如何使用ffmpeg在php中进行视频转换?

mysql - 如何从数据库中每次获取7个元素

php - 无法使用关键字搜索记录,但该关键字已存在于 MySQL 的表中

mysql - 无法理解这个 mysql 查询的逻辑意义

php - Xpath 查询查找其后代包含特定文本的节点

php - Symfony 表单未更改字段返回验证类型错误

mysql - 复杂的 M :N relationship with MySQL tables

python - 用python执行mysqldump并通过stdin设置密码