Нужна помощь с SQL-запросом для модерации комментариев - PullRequest
0 голосов
/ 23 июля 2011

Я разрабатываю систему модерации комментариев как часть моего веб-сайта, чтобы я мог видеть список комментариев до их публикации, чтобы я мог либо опубликовать их в порядке, либо удалить их в случае неприемлемости.

У меня есть haofмой SQL работает нормально, где я могу видеть, кто автор комментария, дату публикации, комментарий и т. д. и даже на какой странице он был (будь то страница новостей, блоги или страница событий).

Однако я не могу отобразить заголовок страницы (заголовок новостей, заголовок блога или заголовок события).

Это действительно поможет, поэтому я хотел бы включить его в свой запрос.

Теперь мой запрос работает так, что он выбирает все в таблице комментариев, включая физическую страницу (новости, блоги, события).

Что я представляю, когда узнаю, к какой странице принадлежит комментарий, запросит эту таблицу и получит заголовок.

Кто-нибудь знает, как мне это сделать?Нужна ли мне вложенная выборка после выбора страницы?

Вот мой текущий запрос ($ get_id) получает идентификатор комментария из URL)

   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'

Ответы [ 2 ]

2 голосов
/ 23 июля 2011

Я предполагаю, что привязка (внешний ключ или перечисляемые значения) - это поля news.'page, blogs.'page и т. Д. Таким образом, выполнение LEFT JOIN для каждого отдельного типа записи должно сделать это и получить из всех полей «page» с выделенным именем (соглашение «AS») и выполнить программную проверку, если какие-либо из этих записей «page» имеют значение 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 голос
/ 23 июля 2011

Предполагая, что поле 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
...