需要有关 SQL 查询以进行评论审核的帮助

Posted

技术标签:

【中文标题】需要有关 SQL 查询以进行评论审核的帮助【英文标题】:Need help with SQL query for comments moderation 【发布时间】:2011-10-11 14:13:03 【问题描述】:

我正在开发一个 cmets 审核系统作为我网站的一部分,因此我可以在 cmets 发布之前查看它们的列表,以便我可以发布它们,或者在不合适时删除它们。

我的 SQL 工作正常,我可以看到评论的作者是谁、发布日期、评论等,甚至是在哪个页面上(无论是新闻页面、博客还是活动页面) .

但是我不能让它显示页面的标题(新闻标题、博客标题或事件标题)。

这真的很有帮助,所以我希望将它合并到我的查询中。

我的查询现在的工作方式是它选择 cmets 表中的所有内容,包括物理页面(新闻、博客、事件)。

我想它要做的是一旦它知道评论属于哪个页面,就是查询该表并获取标题。

有人知道我是怎么做到的吗?选择页面后是否需要嵌套选择?

这是我当前的查询($get_id)从 url 获取评论 id)

   SELECT c . * , ifnull( cc.commentcount, 0 ) AS ccount
        FROM comments c
        LEFT OUTER
        JOIN (

        SELECT page, pageid, count( * ) AS commentcount
        FROM comments
        GROUP BY page
        ) AS cc ON cc.pageid = c.pageid
        WHERE c.commentid = '$get_id'

如果有帮助,这里是数据库结构

CREATE TABLE `comments` (
  `commentid` int(5) NOT NULL auto_increment,
  `page` varchar(20) NOT NULL default '',
  `pageid` int(3) NOT NULL default '0',
  `user` varchar(40) NOT NULL default '',
  `email` varchar(100) NOT NULL default '',
  `website` varchar(100) NOT NULL default '',
  `comment` text NOT NULL,
  `posted` datetime NOT NULL default '0000-00-00 00:00:00',
  `status` enum('0','1') NOT NULL default '0',
  PRIMARY KEY  (`commentid`)
)

// the tables for news, blogs and events are pretty much the same
CREATE TABLE `news` (
  `id` int(4) NOT NULL auto_increment,
  `title` varchar(100) NOT NULL default '',
  `content` text NOT NULL,
  `postdate` date NOT NULL default '0000-00-00',
  `photo` varchar(50) NOT NULL default '',
  `alternate` varchar(50) NOT NULL default '',
  `archived` char(1) NOT NULL default 'n',
  `page` varchar(4) NOT NULL default 'news',
  PRIMARY KEY  (`id`)
)

我不知道这是否有帮助,但这就是我在发布后显示 cmets 的方式

SELECT  c.*, 
    b.title,  
    ifnull(cc.commentcount,0) as ccount 
        FROM comments c 
    INNER 
        JOIN blogs b
            ON c.pageid = b.id 
    LEFT OUTER
        JOIN (SELECT page,pageid, 
                     count(*) as commentcount 
                FROM comments 
                GROUP BY page) as cc 

            on cc.pageid = c.pageid
    WHERE c.pageid='$blogid'

编辑:当前查询与 Ain 提出的更改

SELECT c. * , ifnull( cc.commentcount, 0 ) AS ccount,
CASE c.page
WHEN 'news'
THEN SELECT title
FROM news
WHERE id = c.pageid
WHEN 'blog'
THEN SELECT title
FROM blog
WHERE id = c.pageid
ELSE ''
END FROM comments c
LEFT OUTER JOIN (

SELECT page, pageid, count( * ) AS commentcount
FROM comments
GROUP BY page
) AS cc ON cc.pageid = c.pageid
WHERE c.commentid = '2'

【问题讨论】:

【参考方案1】:

假设表comments 中的字段page 包含“新闻”、“博客”等值来标记“页面类型”评论所属的值,并且comments.pageid 是适当表的FK,您可以执行类似的操作

CASE c.page
  WHEN 'news' THEN SELECT title FROM news WHERE id = c.pageid
  WHEN 'blog' THEN SELECT title FROM blog WHERE id = c.pageid
  ELSE ''
  END

【讨论】:

如何将其添加到我的查询中?如果有帮助,我正在使用 mysql 您将其作为“计算字段”添加到您的第一个查询中,例如 SELECT c . * , ifnull( cc.commentcount, 0 ) AS ccount, **CASE statement here** FROM comments c ... #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'SELECT title FROM news WHERE id = c 附近使用的正确语法。 pageid WHEN 'blog' THEN SELECT title FROM' 在第 1 行 将当前查询添加到我的问题中 我这里没有 MySQL,所以无法测试...但是尝试将 case 语句添加到括号中。或者案例中的查询(THEN 之后的选择语句)必须在括号中......【参考方案2】:

我假设绑定(外键或枚举值)是 news.'page'、blogs.'page' 等字段。因此,对每种类型的条目进行 LEFT JOIN 应该这样做并从所有具有专用名称('AS' 约定)的“页面”字段中获取,并进行编程检查是否有任何“页面”条目为 NULL。 which are not null 包含您要查找的条目。

SELECT c . * ,n.`title` as `newstitle`, b.`title` as `blogstitle`, e.`title` as `eventstitle`, ifnull( cc.commentcount, 0 ) AS ccount
    FROM comments c
    LEFT OUTER
    JOIN (

    SELECT page, pageid, count( * ) AS commentcount
    FROM comments
    GROUP BY page
    ) AS cc ON cc.pageid = c.pageid
    LEFT JOIN 'news' n ON n.'pageid' = c.'pageid'
    LEFT JOIN 'blogs' b ON b.'pageid' = c.'pageid'
    LEFT JOIN 'events' e ON e.'pageid' = c.'pageid'
    WHERE c.commentid = '$get_id'

【讨论】:

@ain 的答案也是我的第一个想法(无论出于何种原因我无法在此处发表评论),但我从来没有在 mysql 上工作过,所以我跳过了那个答案,但如果这是一个可行的解决方案,请纠正我 我最终得到了具有相同评论 ID 但不同博客标题的行。我想这是因为 commentid 属于博客页面,但它没有得到正确的标题 更正了代码,我打错了左连接绑定语句

以上是关于需要有关 SQL 查询以进行评论审核的帮助的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助以获取访问表单以将值插入查询

需要有关 unix 脚本的帮助以从特定位置读取数据并使用在查询中提取的数据

需要 SQL 查询帮助以解析 BigQuery 表中的 JSON 数据

phabricator 从提要故事中获取提交作者,以获取关注、评论和审核的故事

Oracle SQL 排名查询

oracle ebs r12报告的Oracle flex值层次结构SQL查询