Как вывести количество комментариев в FAQ ?

Проблемы с выводом счетчика в предварительный просмотр.

#1 3 февраля 2016 в 23:35
Есть в ICMS1 такой компонент "Вопросы и ответы". И комментарии к вопросам можно писать, а вот количества комментариев к вопросу посмотреть нельзя, пока не откроешь вопрос.
Сами вопросы отдельно из базы не выбираются, формируется сразу вся страница категории, поэтому количество комментариев к каждому вопросу понятными средствами вычислить довольно затруднительно.

Сейчас у меня это сделано через цикл:

  1. FOR($e=0;$e<=$rows-1;$e++)
  2. {
  3. $sql = "SELECT * FROM cms_comments WHERE target = 'anec' AND target_id = ".$quests[$e]['id'].";";
  4. $result = $inDB->query($sql) ;
  5. $rows2 = $inDB->num_rows($result);
  6. $quests[$e]['comments_vote']=$rows2;
  7. }
Но я думаю, что устраивать запросы в базу в цикле по 40 раз на странице не очень кошерно. Поэтому есть мысль подсчитать количество комментариев к каждому вопросу прямо при выборке вопросов из базы при формировании страницы с категорией.
Но возникло некоторое затруднение. При поиске в лефтджойненой таблице с каментами вывод самих вопросов начинает дублироваться. Сколько у вопроса каментов — столько сделает дублей вопроса.
  1. $sql = "SELECT q.*, c.title cat_title, c.id cid, u.login, u.nickname, r.item_id rid, m.id comm
  2. FROM cms_anec_quests q
  3. LEFT JOIN cms_faq_cats c ON c.id = q.category_id
  4. LEFT JOIN cms_comments m ON m.target_id = q.id AND m.target = 'faq'
  5. LEFT JOIN cms_ratings r ON r.item_id = q.id AND r.target = 'quest' AND r.user_id = {$inUser->id}
  6. LEFT JOIN cms_users u ON u.id = q.user_id WHERE q.published = 1
  7. ORDER BY q.pubdate DESC
  8. LIMIT 15";
Пробовал по-другому :
  1. $sql = "SELECT q.*, c.title cat_title, c.id cid, u.login, u.nickname, r.item_id rid, COUNT(m.id) comm
  2. FROM cms_anec_quests q
  3. LEFT JOIN cms_faq_cats c ON c.id = q.category_id
  4. LEFT JOIN cms_comments m ON m.target_id = q.id AND m.target = 'faq'
  5. LEFT JOIN cms_ratings r ON r.item_id = q.id AND r.target = 'quest' AND r.user_id = {$inUser->id}
  6. LEFT JOIN cms_users u ON u.id = q.user_id WHERE q.published = 1
  7. ORDER BY q.pubdate DESC
  8. LIMIT 15";
Тогда оно 5 минут вертит электронами и выдает на страницу один, самый первый вопрос и количество каментов к нему 360000 с лишним...
То есть запрос вытряхивает все каменты к вопросам из базы.

Может кто подскажет, как организовать вывод счетчика по правильному?

____________________________________________________________

В общем, заработало с GROUP BY

  1. $sql = "SELECT q.*, c.title cat_title, c.id cid, u.login, u.nickname, COUNT(m.target_id) comm
  2. FROM cms_faq_quests q
  3. LEFT JOIN cms_faq_cats c ON c.id = q.category_id
  4. LEFT JOIN cms_users u ON u.id = q.user_id
  5. LEFT JOIN cms_comments m ON m.target_id = q.id
  6. WHERE q.published = 1
  7. GROUP BY m.target_id
  8. ORDER BY q.pubdate DESC
  9. LIMIT ".(($page-1)*$perpage).", $perpage";
Но оооочень долго. 24 секунды думает.
Видимо придется оставить цикл…
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.