我正在开发一个评论审核系统作为我网站的一部分,所以我可以在发布之前看到评论列表,这样我就可以将它们发布为好的,或者如果不合适则删除它们。
我的SQL工作正常,我可以看到评论的作者是谁,发布的日期,评论等甚至是它所在的页面(无论是新闻页面,博客还是活动页面)
我无法做到的是显示页面标题(新闻标题,博客标题或事件标题)。
这确实很有帮助,所以我希望将它纳入我的查询。
我的查询现在如何工作是它选择评论表中的所有内容,包括物理页面(新闻,博客,事件)。
我想它要做的就是一旦它知道评论所属的页面,就是查询该表并获得标题。
有谁知道我是怎么做到的?一旦选择了页面,我是否需要嵌套选择?
这是我当前的查询($ get_id)从网址获取评论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`)
)
我不知道这是否有帮助,但这就是我在发布后显示评论的方式
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'
答案 0 :(得分:2)
我假设绑定(外键或枚举值)是news.'page',blogs.'page'等字段。因此,对每种类型的条目执行LEFT JOIN应该执行此操作并从具有专用名称(“AS”约定)的所有“页面”字段获取并执行programaticaly检查是否任何此“页面”条目为NULL。哪些不为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'
答案 1 :(得分:1)
假设表page
中的字段comments
包含“新闻”,“博客”等值,以标记“页面类型”评论所属,而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