需要有关 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 数据