2016-04-08 2 views
0

Это ситуация:Получить количество записей из одной таблицы с помощью присоединиться

  • У меня есть 3 таблицы, пользователя, группу, user_group (реляционная таблица)
  • В пользователь мы имеем: идентификатора
  • В группы мы имеем: Идентификатор, люди (число максимальных людей, которые могут находиться в группе)
  • В user_group: group_id, user_id

То, что я хочу сделать в том же запросе, чтобы получить все группы, которые еще не заполнены. Что означает, что существует меньше user_group (всего), связанных с группой, чем человек (group.people) есть в группе .

Например: группа с id = 5 с людьми = 6 и есть 6 user_group с group_id = 5. Таким образом, запрос я хочу, чтобы добраться до, не получит group.id = 5

Это то, что я получил до сих пор:

SELECT `group`.* 
FROM `group` 
JOIN `user_group` ON `user_group`.`group_id` = `group`.`id` 
WHERE `group`.`people` > ¿COUNT(total_user_gruop)? 

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

Спасибо людям!

ответ

1

Вам необходимо указать GROUP BY и HAVING.

HAVING выполняет после GROUP BY и считает, что у вас есть счет, который вам нужно сравнить с людьми группы.

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

SELECT G.Group_ID, count(Distinct UG.User_ID) 
FROM user_group UG 
INNER JOIN `group` G 
on UG.Group_ID = G.ID 
GROUP BY G.Group_ID 
HAVING count(Distinct UG.User_ID) < G.People 
+0

Я не допускаю дубликатов. Но я узнал что-то новое с вашим запросом. благодаря! – Dazag

1

Проверьте этот запрос.

Select `group`.*, count(`user_group`.user_id) as current_users from `user_group` 
inner join `group` on `group`.id = `user_group`.group_id 
group by `user_group`.group_id 
having count(`user_group`.user_id) < `group`.people 
1

Надеюсь, что это решит ваши проблемы.

SELECT * 
FROM `group` 
INNER JOIN `user_group` ON `group`.`id` = `user_group`.`group_id` 
GROUP BY `user_group`.`group_id` 
HAVING COUNT(`user_group`.`user_id`) < `group`.`people` 
Смежные вопросы