2017-01-31 5 views
1

Вот моя структура таблицы:Как я могу подсчитать количество всех голосов на одного избирателя?

// users 
+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | Jack | 
| 2 | Peter | 
| 3 | John | 
| 4 | Barman | 
| 5 | Ali | 
+----+--------+ 

// vote 
+----------+---------------+---------+ 
| voter_id | owner_post_id | post_id | 
+----------+---------------+---------+ 
| 2  | 3    | 1653 | 
| 4  | 2    | 1214 | 
| 1  | 1    | 4355 | 
| 4  | 2    | 6445 | 
| 2  | 2    | 5465 | 
| 3  | 2    | 5435 | 
+----------+---------------+---------+ 

А вот мой текущего запрос:

SELECT t2.id AS user_id, 
     t2.name AS user_name, 
     t3.id AS voter_id, 
     t3.name AS voter_name 
FROM vote t1 
INNER JOIN users t2 
    ON t1.owner_post_id = t2.id 
INNER JOIN users t3 
    ON t1.voter_id = t3.id 
WHERE t1.owner_post_id = 2 AND 
     t1.voter_id <> t1.owner_post_id 

А вот мой выходного тока:

+---------+-----------+----------+------------+ 
| user_id | user_name | voter_id | voter_name | 
+---------+-----------+----------+------------+ 
| 2  | Peter  | 4  | Barman  | 
| 2  | Peter  | 4  | Barman  | 
| 2  | Peter  | 3  | John  | 
+---------+-----------+----------+------------+ 

Теперь я хочу добавить еще один столбец в результат, который содержит общее количество голосов на одного избирателя. Так что это ожидаемый результат:

+---------+-----------+----------+------------+-----------+ 
| user_id | user_name | voter_id | voter_name | total_num | 
+---------+-----------+----------+------------+-----------+ 
| 2  | Peter  | 4  | Barman  | 2   | 
| 2  | Peter  | 3  | John  | 1   | 
+---------+-----------+----------+------------+-----------+ 

Как я могу это сделать?

+0

Как подсчитать => 'COUNT (?), Как x' –

+0

@ Fred-II- Я знаю, что я должен как использовать' COUNT (COL) 'и' группу by' пункта. Но я не знаю, как использовать их в текущем запросе. – stack

+0

Вы только получаете Петра/Бармена только по вашему запросу? Я думаю, вы должны получить пару дважды, потому что для пары есть две записи голоса. –

ответ

1

Получить все голоса для пользователя, агрегировать их и сосчитать. Затем дважды присоединитесь к таблице пользователей; один раз для пользователя, один раз для избирателя.

select 
    usr.id as user_id, 
    usr.name as user_name, 
    vtr.id as voter_id, 
    vtr.name as voter_name, 
    v.cnt as total_num 
from 
(
    select owner_post_id, voter_id, count(*) as cnt 
    from vote 
    where owner_post_id = 2 and owner_post_id <> voter_id 
    group by owner_post_id, voter_id 
) v 
join user usr on usr.id = v.owner_post_id 
join user vtr on usr.id = v.voter_id; 

И вот тот же метод, применимый к вашему реальному запросу. Просто некоторые другие имена таблиц и столбцов, поэтому я думаю, что вы должны были сделать это сами.

select 
    pr1.id as user_id, 
    pr1.title as user_name, 
    pr2.id as liker_id, 
    pr2.title as liker_name, 
    x.which as which_table, 
    x.cnt as total 
from 
(
    select rid, rootid, which, count(*) as cnt 
    from 
    (
    select rid, rootid, 'vote' which from p_likes 
    union all 
    select rid, rootid, 'comment' which from p_comments 
    union all 
    select rid, rootid, 'friend' which from relations 
) all_in_one 
    where rootid = 1 and rootid <> rid 
    group by rid, rootid, which 
) x 
join pagesroot pr1 on x.rootid = pr1.id 
join pagesroot pr2 on x.rid = pr2.id 
order by x.which; 
+0

Отличный запрос ..! upvote. Просто вы можете применить свою идею к моему [реальному запросу] (https://gist.github.com/sajadshafizadeh/f968de5d1cbfd9500820047f19f0d8c4)? – stack

+0

* «Думаю, вы должны были сделать это сами». *. я должен делать что-то точно ?! Все имена, которые вы использовали в вашем запросе, мне кажутся подходящими ... – stack

+0

Я имел в виду, что получить запрос от пользователя/голоса к реальному запросу не так уж сложно. Имена таблиц различны, и некоторые имена столбцов имеют общий подзапрос union-all, а не таблицу. Единственное реальное различие заключается в том, что вам нужны разные строки результатов на «which», поэтому вам также нужно группировать «which». Что-то вы могли бы сделать сами, а не спрашивать меня, и вы бы практиковали свои навыки SQL в этом процессе. –

1
SELECT t2.id AS user_id, 
     t2.name AS user_name, 
     t3.id AS voter_id, 
     t3.name AS voter_name 
     Count(t1.voter_id) AS total_num 
FROM vote t1 
INNER JOIN users t2 
    ON t1.owner_post_id = t2.id 
INNER JOIN users t3 
    ON t1.voter_id = t3.id 
WHERE t1.owner_post_id = 2 AND 
     t1.voter_id <> t1.owner_post_id 
GROUP BY t2.id AS user_id, 
     t2.name, 
     t3.id, 
     t3.name 

EDIT:

SELECT pr1.id AS user_id, 
     pr1.title AS user_name, 
     pr2.id AS liker_id, 
     pr2.title AS liker_name, 
     x.which AS which_table, 
     COUNT(pr1.id) AS total 
FROM (
SELECT rid, rootid, 'vote' which FROM p_likes 
UNION ALL 
SELECT rid, rootid, 'comment' which FROM p_comments 
UNION ALL 
SELECT rid, rootid, 'friend' which FROM relations 
) x 
INNER JOIN pagesroot pr1 
     ON x.rootid = pr1.id 
INNER JOIN pagesroot pr2 
     ON x.rid = pr2.id 
WHERE x.rootid = 1 
     AND x.rootid <> x.rid 
GROUP BY pr1.id, 
     pr1.title, 
     pr2.id, 
     pr2.title, 
     x.which 
ORDER BY x.which 
+0

Спасибо .. upvote .. но, честно говоря, мой реальный запрос выглядит как [это] (https://gist.github.com/sajadshafizadeh/f968de5d1cbfd9500820047f19f0d8c4). Не могли бы вы рассказать мне, как я могу это сделать по моему реальному запросу? – stack

Смежные вопросы