Подсчет кол-ва комментариев на главной

Тема в разделе 'MySQL', создана пользователем Илья Карлеоне, 14 ноя 2011.

  1. Илья Карлеоне Новичок

    В общем такое дело, на главной странице нужно вывести под каждой новостью, кол-во комментариев к этой новости...
    Есть две таблицы, с комментариями и с новостями. В таблице "комметарии" есть стобец с названием "заметка", в этом столбце указывается id той новости к которой написан коммент.

    Пробовал делать запросы по разному, но постоянно выводился какой-то бред =)
    Последний запрос был такой:

    Код:
    $commen = "SELECT data.id, comments.zametka FROM data,comments WHERE comments.zametka=data.id";
    $comen = mysql_fetch_array($comm);
    return $comen; 
    понятное дело, ошибка скорее всего в запросе, но как написать правильный запрос не знаю, помогите...
  2. XmP ADD ebx, 110h

    С таблицами не понял, для этого нужно привести структуру. К примеру моя структура:
    PHP:
    CREATE TABLE IF NOT EXISTS `news` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    newstext CHARACTER SET utf8 NOT NULL,
      
    PRIMARY KEY (`id`)
    ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci AUTO_INCREMENT=;

    --
    -- 
    Дамп данных таблицы `news`
    --

    INSERT INTO `news` (`id`, `news`) VALUES
    (1'newsnewsnews');

    CREATE TABLE IF NOT EXISTS `comment` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    idnewsint(11NOT NULL,
      `
    commenttinytext NOT NULL,
      
    PRIMARY KEY (`id`)
    ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=;

    --
    -- 
    Дамп данных таблицы `comment`
    --

    INSERT INTO `comment` (`id`, `idnews`, `comment`) VALUES
    (51'dghdghcghg'),
    (
    31'tststt'),
    (
    41'tststttststttststttststttststttststttststttststttststttststtv');
    И сам запрос:
    SELECT `id`, `news`, (SELECT count(*) FROM `comment` WHERE idnews = news.id LIMIT 1) as `comnum` FROM `news` WHERE news.id=1
  3. Илья Карлеоне Новичок

    Вот, выкладываю структуру, в таблице data, cat - это id категории новости.

    PHP:
    -- Table structure for table `data`

    --
      
    CREATE TABLE IF NOT EXISTS `data` (

      `
    idint(5NOT NULL AUTO_INCREMENT,

      `
    catint(1NOT NULL,

      `
    meta_dvarchar(255NOT NULL,

      `
    meta_kvarchar(255NOT NULL,

      `
    descriptiontext NOT NULL,

      `
    texttext NOT NULL,

      `
    viewint(5NOT NULL,

      `
    authorvarchar(100NOT NULL,

      `
    datedate NOT NULL,

      `
    mini_imgvarchar(255NOT NULL,

      `
    titlevarchar(255NOT NULL,

      
    PRIMARY KEY (`id`),

      
    FULLTEXT KEY `text` (`text`)

    ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=10 ;
      
    --

    -- 
    Dumping data for table `data`

    --
      
    INSERT INTO `data` (`id`, `cat`, `meta_d`, `meta_k`, `description`, `text`, `view`, `author`, `date`, `mini_img`, `title`) VALUES

    (12'Мета''Мета тэг''Краткое описание новости''Полное описанин новости'1'admin''2011-06-10''/img/0000255.png''Название новости'),

    (
    22'Мета''Мета тэг''Краткое описание новости''Полное описанин новости'1'admin''2011-06-10''/img/0000255.png''Название новости'),

    (
    31'Мета''Мета тэг''Краткое описание новости''Полное описанин новости'1'admin''2011-06-10''/img/0000255.png''Название новости'),
        
    --

    -- 
    Table structure for table `comments`

    --
      
    CREATE TABLE IF NOT EXISTS `comments` (

      `
    idint(5NOT NULL AUTO_INCREMENT,

      `
    zametkaint(5NOT NULL,

      `
    authorvarchar(100NOT NULL,

      `
    texttext NOT NULL,

      `
    datevarchar(20NOT NULL,

      `
    mailvarchar(100NOT NULL,

      
    PRIMARY KEY (`id`)

    ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=282 ;
      
    --

    -- 
    Dumping data for table `comments`

    --
      
    INSERT INTO `comments` (`id`, `zametka`, `author`, `text`, `date`, `mail`) VALUES

    (12'Имя коментатора''сам коммент''13.11.2011  23:11''gfdgg@dfsdfds.ru'),

    (
    25'Имя комментатора''сам коммент''13.11.2011  23:11''gfdgg@dfsdfds.ru'),

    (
    35'Имя комментатора''сам коммент''13.11.2011  23:11''gfdgg@dfsdfds.ru');
  4. XmP ADD ebx, 110h

    Если выводить все поля, тогда так:
    SELECT *, (SELECT count(*) FROM `comments` WHERE zametka = data.id LIMIT 1) as `count` FROM `data` WHERE data.id=1
    В поле countбудет количество комментариев. Если нет - вместо * подставить нужные.
  5. Илья Карлеоне Новичок

    выводит комментарии, но только количество комментариев где id =1, тоесть всем статьям присваивает "Комментариев: 0", т.к. к 1 статье коментов нет
  6. XmP ADD ebx, 110h

    Упс. Этот запрос показывает только одну заметку, а не все. Можно использовать для вывода одной новости, вот для всех:
    SELECT *, (SELECT count(*) FROM `comments` WHERE zametka = data.id LIMIT 1) as `count` FROM `data`
    В конце запроса у меня условие WHERE - его просто надо было убрать:)
  7. Илья Карлеоне Новичок

    Неа, пробовал убирать WHERE всё равно показывало по нулям...
    Хотя может я вывожу неправильно эти коменты?
    Это в файле с функциями:
    PHP:
    function colCommment()
    {
        
    $commen "SELECT data.id, (SELECT count(*) FROM comments WHERE comments.zametka = data.id) as count FROM data";
        
    $result mysql_query($commen);
        
    $comen mysql_fetch_assoc($result);

        return 
    $comen;
    }
    Это на самой странице:
    PHP:
    Комментариев: <?=$comen['count']?>
    Если оставить просто функцию $comen, то выводит надпись Array, если со значением count, то нули :D
  8. XmP ADD ebx, 110h

    Правильно - нули - новости обрабатываются по порядку - а mysql_fetch_assoc нужно обрабатывать в цикле. Если это делаеться - то только mysql_fetch_assoc, запрос повторять не надо! В данном коде и все новости будут одинаковые...

    Вообще советую проверять запросы в phpmyadmin, понять что они выводят, а потом выводить их на странице.
  9. Илья Карлеоне Новичок

    В общем с выводом разобрался, количество комментов для каждой новости выводит правильно, но теперь получается два цикла в одном блоке новостей, соответственно из-за открытия DIV в одном цикле и закрытии его же в другом выводит полную чушь :banghead:, что можно сделать?

    PHP:
    <?php foreach ($writes as $write): ?>
        <div class='news_block'>
        <div class='news_name'><a href='/category/<?=$write['cat']?>/write/<?=$write['id']?>/'><?=$write['title']?></a></div>
        <div class='other_info0'><img src="/img/news/date.png" alt=""/> <?=$write['date']?> | <img src="/img/news/category.png" alt=""/> Категория: <?=$write['titlecat']?></div>
        <div class='news_text'><?=$write['description']?></div>
        <div class='other_info'><a href='/category/<?=$write['cat']?>/write/<?=$write['id']?>/'><img src="/img/news/read.png" alt=""/> Читать полностью</a> | <img src="/img/news/view.png" alt=""/>
    <?php endforeach ?>
    <?php 
    foreach ($comen as $comments): ?>
        Комментариев: <?=$comments['count']?>
        </div>
        </div>
    <?php endforeach ?>
  10. XmP ADD ebx, 110h

    Я не понимаю что вы хотите получить? И в дополнении - можно видеть полный код страницы?
  11. Илья Карлеоне Новичок

    У меня получается нужно сделать цикл в цикле, но как в foreach вложить ещё один foreach? По коду, который я выложил в предыдущем комменте получается так:

    Красным и синим выделены две разные новости, и получается, что в красную новость вставляется синяя из-за закрытия тега div не там где нужно. Вот код функций для вывода комментариев и новостей (не знаю, может можно как то объединить две функции в одну):
    PHP:
    function writeAll() //Список новостей на главной
    {
        
    //Извлечение статей
        
    $write "SELECT d.id,d.cat,d.text,d.title,d.description,d.date,c.text,c.cat,c.titlecat FROM data d LEFT JOIN categories c ON d.cat = c.id GROUP BY 1 ORDER BY id DESC LIMIT 10";
        
    $result mysql_query($write);

        if(!
    $result)
            die(
    mysql_error());

        
    $w mysql_num_rows($result);
        
    $writes = array();

        for (
    $i 0$i $w$i++)
        {
            
    $row mysql_fetch_assoc($result);
            
    $writes[] = $row;
        }
     
        return 
    $writes;
    }

    function 
    colCommment() //Кол-во комментариев к новости
    {
        
    $comen 0;
        
    $comm "SELECT data.id, (SELECT count(*) FROM comments WHERE comments.zametka = data.id) as count FROM data";
        
    $result mysql_query($comm);

        if(!
    $result)
            die(
    mysql_error());

        
    $com mysql_num_rows($result);
        
    $comen=array();

        for(
    $i 0$i $com$i++)
        {
            
    $row mysql_fetch_assoc($result);
            
    $comen[] = $row;
        }
        return 
    $comen;
    }
  12. XmP ADD ebx, 110h

    Соедени два запроса в один, а именно в общий запрос, добавь поле: (SELECT count(*) FROM comments WHERE comments.zametka = data.id) as count
  13. Илья Карлеоне Новичок

  14. XmP ADD ebx, 110h

    Ну так объедени и используй один запрос?
  15. Илья Карлеоне Новичок

    пробовал по всякому добавлять в общий запрос второй, выводит ошибку синтаксиса mysql
  16. XmP ADD ebx, 110h

    Можешь выдать полный дамп БД? Я составлю.
  17. Илья Карлеоне Новичок

    нет проблем

    Вложения:

    • phpblog.rar
      Размер файла:
      1,6 КБ
      Просмотров:
      3
  18. XmP ADD ebx, 110h

    PHP:
    SELECT
        d
    .idd.textd.titled.descriptiond.datec.textc.catc.titlecat, (SELECT count(*) FROM comments WHERE comments.zametka d.id) as count
            FROM data d
        LEFT JOIN categories c
            ON d
    .cat c.id
        ORDER BY id DESC
        LIMIT 10
  19. Илья Карлеоне Новичок

    мда... походу надо штудировать mysql запросы, спасибо огромное, всё работает!
    XmP нравится это.

Поделиться этой страницей