За последние 24 часа нас посетил 17781 программист и 1623 робота. Сейчас ищут 1706 программистов ...

Вопрос по count()

Тема в разделе "MySQL", создана пользователем Hawk, 18 апр 2008.

  1. Hawk

    Hawk Активный пользователь

    С нами с:
    30 авг 2007
    Сообщения:
    201
    Симпатии:
    0
    Адрес:
    Беларусь
    [sql]
    create table cms_news(
    NewsID smallint unsigned not null auto_increment primary key,
    NewsTitle varchar(90) not null,
    ...
    )
    engine = InnoDB;

    create table cms_news_comments(
    ComID smallint unsigned not null auto_increment primary key,
    ...
    NewsID smallint unsigned not null,
    foreign key(NewsID) references cms_news(NewsID)
    )
    engine = InnoDB;
    [/sql]
    тут пропущены строки которые не имеют никогого отношения к вопросу и собственно вопрос:
    как к выборке например такой(упрощенно, там еще таблицы соеденяються)
    [sql]
    select n.NewsID, NewsTitle, count() as CountComments
    from cms_news as n left join cms_news_comments as com
    on n.NewsID=com.NewsID;
    [/sql]
    сделать так чтобы поле CountComments содержало кол-во комментариев к каждой из статей и возможно ли это? как не фантозировал что-то ничего не выходит...
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    [sql]SELECT id, name, (SELECT count(*) FROM `comments` WHERE `comments`.pid=`news`.pid) as ncount FROM `news`[/sql]
    Пробовали?
     
  3. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    [sql]SELECT id, name, count(`comment`.id)
    FROM `news`
    LEFT JOIN `comment` ON ( ... )
    GROUP BY `news`.id[/sql]

    Может так? ;)
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Hawk
    В моем проекте используется подобная схема, но там все построено на ORM, если верхние посты не помогают, то могу вытащить из проекта SQL
     
  5. Hawk

    Hawk Активный пользователь

    С нами с:
    30 авг 2007
    Сообщения:
    201
    Симпатии:
    0
    Адрес:
    Беларусь
    topas
    Спасибо большое, только пришел, сейчас буду пробавать...
     
  6. Hawk

    Hawk Активный пользователь

    С нами с:
    30 авг 2007
    Сообщения:
    201
    Симпатии:
    0
    Адрес:
    Беларусь
    topas
    SELECT id, name, (SELECT count(*) FROM `comments` WHERE `comments`.pid=`news`.pid) as ncount FROM `news`

    вот это заработало, но единственное вопрос производительности, насколько это замедлит поиск?
    просто я думал присоеденить таблицу с комментами а не встраивать подзапрос или в плане производительности это не очень страшно?
     
  7. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    тестируем и выкладываем результаты :)
     
  8. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Где то на днях попадалось. Подзапрос может гнать и выполняться каждый раз при сканировании основной таблицы . Пофиксят не раньше MySQL 6.0.