Несколько подсчетов в одном запросе SQL - PullRequest
3 голосов
/ 06 марта 2012

Я создаю веб-приложение с CodeIgniter.

Пользователи могут "любить" или "ненавидеть" сообщения. Эти действия хранятся в таблице post_rating со следующими столбцами:

  • ID
  • post_id
  • user_id
  • Оценка

Рейтинг может быть 0 для нейтрального, 1 для любви или 2 для ненависти.

В моей модели я вернул некоторую базовую информацию для каждого сообщения со следующей функцией:

function get_posts($thread_id)

{

    $this->db->select('id, user_id, date_posted, content');
    $this->db->from('post');
    $query = $this->db->get();

    if ($query->num_rows() > 0)

    {

        return $query->result();

    }

}

Я понимаю, что мне нужно присоединиться к таблице post_rating, но как мне также вернуть счетчики любви и ненависти в том же массиве, что и заголовок, содержимое и т. Д.?

Спасибо!

:)

UPDATE!

Вот моя МОДЕЛЬ на данный момент:

function get_posts($thread_id)

{

    $this->db->select('post.id, post.user_id, post.date_posted, post.content, post.status_visible, user.username, user.location, user.psn, user.clan, user.critic, user.pro, SUM(case when rating = 1 then 1 end) as love, SUM(case when rating = 2 then 1 end) as hate');
    $this->db->from('post');
    $this->db->join('user', 'user.id = post.user_id', 'left');
    $this->db->join('post_rating', 'post_rating.post_id = post.id', 'left');
    $this->db->where('thread_id', $thread_id);
    $this->db->order_by('date_posted', 'asc');
    $query = $this->db->get();

    if ($query->num_rows() > 0)

    {

        $this->db->select('id');
        $this->db->from('post_vote');

        return $query->result();

    }

}

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Вы можете использовать case для суммирования двух разных характеристик:

select  title
,       content
,       sum(case when pr.rating = 1 then 1 end) as Love
,       sum(case when pr.rating = 2 then 1 end) as Hate
,       (
        select  count(*)
        from    posts up
        where   up.user_id = p.user_id
        ) as UserPostCount
from    posts p
left join
        posts_rating pr
on      pr.post_id = p.post_id
group by
        title
,       content
,       user_id
2 голосов
/ 06 марта 2012
select p.post_id, 
       max(p.title) title,
       count(case pr.rating when 1 then 1 else null end) lovecount,
       count(case pr.rating when 2 then 1 else null end) hatecount
from YourPostsTable p 
left join post_rating pr on p.post_id = pr.post_id
group by p.post_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...