Как ПОСЧИТАТЬ и ВЫБРАТЬ с помощью WHERE в sql?

#mysql

#mysql

Вопрос:

У меня есть две таблицы user и group , а также a usergroup в качестве таблицы ссылок, которая содержит, какие пользователи существуют в группе.

user таблица

  ----- ------- 
| id  | name  |
 ----- ------- 
| U12 | John  |
| U13 | Rick  |
| U14 | Morty |
| U15 | Alex  |
| U16 | Felix |
 ----- ------- 
  

group таблица

  ----- -------- -------- 
| id  |  name  | points |
 ----- -------- -------- 
| G12 | Red    |     11 |
| G13 | Blue   |     22 |
| G14 | Green  |     55 |
| G15 | Yellow |     64 |
| G16 | Orange |     23 |
 ----- -------- -------- 
  

usergroup таблица

  ---- --------- ---------- 
| id | user_id | group_id |
 ---- --------- ---------- 
|  1 | U12     | G12      |
|  2 | U14     | G12      |
|  3 | U15     | G12      |
|  4 | U15     | G15      |
|  5 | U12     | G13      |
 ---- --------- ---------- 
  

Чтобы выбрать группы, в которых находится конкретный пользователь, я могу просто сделать

 SELECT group.*
FROM usergroup 
INNER JOIN group 
ON group.id = usergroup.group_id 
WHERE usergroup.user_id = ?
  

Но как также одновременно выбрать количество всех пользователей в одной группе?

Ожидаемый пример вывода — для групп, в которых находится пользователь U12 , вместе с общим количеством пользователей

  ----- ------ -------- ------------- 
| id  | name | points | users_count |
 ----- ------ -------- ------------- 
| G12 | Red  |     11 |           3 |
| G13 | Blue |     22 |           1 |
 ----- ------ -------- ------------- 
  

Ответ №1:

используйте скалярный подзапрос

 SELECT `group`.* , (select count(id) from usergroup a where a.group_id=usergroup.group_id ) as user_count
FROM usergroup 
INNER JOIN `group` ON `group`.id = usergroup.group_id 
WHERE usergroup.user_id = 'U12'
  

Ответ №2:

 SELECT y.id, y.name, y.points, y.users_count
FROM usergroup x INNER JOIN
    ( SELECT b.id, b.name, b.points, count(a.user_id) as users_count
    FROM usergroup a INNER JOIN group b
    ON a.group_id = b.id
    GROUP BY b.id ) AS y
ON x.group_id = y.id
WHERE x.user_id = 'U12'
  

Ответ №3:

 SELECT a.group_id,
       a.NAME,
       a.points,
       c.user_count
FROM   group a,
       usergroup b,
       (SELECT x.group_id,
               Count(*) AS user_count
        FROM   usergroup x
        GROUP  BY x.group_id) c
WHERE  a.group_id = b.group_id
       AND a.group_id = c.group_id
       AND user_id = 'U12'; 
  

Ответ №4:

 SELECT group.*, count(usergroup.group_id),usergroup.user_id
FROM usergroup 
INNER JOIN group 
ON group.id = usergroup.id 
GROUP BY usergroup.group_id
Having usergroup.user_id = 'U12'
  

Вам нужно использовать group by с помощью having.
Проверьте это на SQLFiddle: sqlfiddle.com /#!9/b63e13/3/0

Комментарии:

1. Прочитайте вопрос, OP хочет получить count при передаче user-id. Группировка не даст желаемого результата.

2. вы тестировали свой sql? существует множество ошибок, таких как наличие причины