#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? существует множество ошибок, таких как наличие причины