2012-03-05 2 views
3

Я создаю веб-приложение с помощью CodeIgniter.Несколько счетчиков в одном запросе SQL

Пользователи могут «любить» или «ненавидеть» сообщения. Эти действия хранятся в таблице под названием 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(); 

    } 

} 
+0

Более разумная схема оценки будет 0 для нейтральный, 1 для любви и -1 для ненависти. –

+0

Хороший звонок. Я могу переключить его. Благодаря! – Leeloo

+0

Не большая разница в этом запросе, но вы можете найти 'SUM (рейтинг)' полезный позже :) –

ответ

2

Вы можете использовать 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 
+0

Забавно, мы отправили два немного разных решения в одно и то же время (с точностью до секунд) –

+0

Спасибо, приятель. Он работает, но теперь он возвращает только один пост (он возвращал все из них раньше). Я обновил OP своей текущей моделью. Есть идеи? – Leeloo

+0

@Tim: добавить 'group by p.post_id' –

2
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 
Смежные вопросы