Get

2016-04-08 9 views
0

beitreten Dies ist die Situation:Get

  • I 3 Tabellen haben, Benutzer, Gruppe, user_group (relationale Tabelle)
  • In Benutzer haben wir: id
  • In Gruppe haben wir: id, Menschen (Anzahl der maximalen Personen, die in der Gruppe sein kann)
  • In user_group: group_id, user_id

Was will ich in derselben Abfrage erreichen, alles zu bekommen, ist die Gruppen, die noch nicht voll sind. Das heißt, es gibt weniger user_group (insgesamt) zur Gruppe als Personen (group.people) gibt es in der Gruppe.

ZB: die Gruppe mit id = 5 mit Personen = 6 und es gibt 6 user_group mit group_id = 5. So ist die Abfrage, die ich zu bekommen, würde sich nicht group.id = 5

Dies ist, was ich bisher habe:

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

Ich dachte über eine Unterabfrage, um die Gesamt zu erhalten Anzahl der user_groups pro Gruppe, aber ich habe keine Ahnung, wie man das erreicht oder ob es überhaupt möglich ist ...

Danke Leute!

Antwort

1

Sie benötigen einen GROUP BY und HAVING Klausel.

HAVING führt nach der GROUP BY und zählt so haben Sie die Anzahl müssen Sie gegen die Gruppe Menschen vergleichen.

Ich benutze ein distinct hier nur, weil ich nicht weiß, ob Duplikate in der Benutzergruppentabelle zulassen; und ich nehme an, dass ein solches Duplikat, wenn es existiert, nicht mehr als einmal gegen die Summe zählen sollte.

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

Ich erlaube keine Duplikate. Aber ich habe mit Ihrer Anfrage etwas Neues gelernt. Vielen Dank! – Dazag

1

Überprüfen Sie diese Abfrage.

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

Hoffe das lösen Ihre Probleme.

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`