2017-06-03 5 views
2

Iは、2つのテーブルusersgroups、並びに定義第3のテーブルを持って多対多の関係users_groups多対多の関係でグループごとにユーザーを数える方法は?

表 "グループ":

CREATE TABLE `group` (
    `ID` int(11) NOT NULL, 
    `creation_date` date NOT NULL, 
    `type` varchar(50) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `group` (`ID`, `creation_date`, `type`) VALUES 
(1, '2017-06-01', 'AAA'), 
(2, '2017-06-01', 'BBB'), 
(3, '2017-06-01', 'CCC'); 

表 "ユーザー":

CREATE TABLE `user` (
    `ID` int(11) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    `surnames` varchar(100) NOT NULL, 
    `birthdate` date NOT NULL, 
    `qualification` varchar(100) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `user` (`ID`, `name`, `surnames`, `birthdate`, `qualification`) VALUES 
(1, 'xxx', 'xxx', '1989-03-03', 'A'), 
(2, 'xxx', 'xxx', '1990-06-15', 'A'), 
(3, 'xxx', 'xxx', '1982-06-14', 'B'), 
(4, 'xxx', 'xxx', '1988-06-19', 'B'), 
(5, 'xxx', 'xxx', '1984-03-12', 'B'), 
(6, 'xxx', 'xxx', '1987-12-19', 'C'); 

表 "users_groups":

CREATE TABLE `user_group` (
    `ID` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `group_id` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `user_group` (`ID`, `user_id`, `group_id`) VALUES 
(1, 1, 1), 
(2, 2, 1), 
(3, 3, 2), 
(4, 4, 2), 
(5, 5, 2), 
(6, 6, 3); 

私はグループあたりのユーザー数をカウントし、次のような結果を要約する必要があります。

ID creation_date type users_count_per_group 
1 2017-06-01  AAA 2 
2 2017-06-01  BBB 3 
3 2017-06-01  CCC 1 

これは私の現在のクエリです。 (私のサンプルデータでは、すべてのユーザーがグループごとに一度だけ表示されますが)私は、同じユーザーが別のグループに表示されることを意味し、多対多の関係で立ち往生:

SELECT `group`.`ID`, `group`.`creation_date`, `group`.`type`, COUNT(*) 
FROM `group`, `user`, `user_group` 
WHERE `group`.`ID`=`user_group`.`group_id` 
     AND `user`.`ID`=`user_group`.`user_id`; 
+1

次のGROUP BY句が必要です。https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html –

答えて

2

あなたはgroup byが欠落しています句:暗黙的に参加し

SELECT `group`.`ID`, `group`.`creation_date`, `group`.`type`, COUNT(*) 
FROM  `group`, `user`, `user_group` 
WHERE `group`.`ID`=`user_group`.`group_id` AND 
     `user`.`ID`=`user_group`.`user_id` 
GROUP BY `group`.`ID`, `group`.`creation_date`, `group`.`type` 

注(すなわち、from句で複数のテーブルを使用しては)今かなりの時間のために非推奨と考えられてきました。あなたがやりたいusersテーブルに参加する必要はありません

SELECT `group`.`ID`, `group`.`creation_date`, `group`.`type`, COUNT(*) 
FROM `user_group` 
JOIN `user` on `user`.ID = `user_group`.`user_id` 
JOIN `group` on `group`.ID = `user_group`.`group_id` 
GROUP BY `user_group`.`group_id` 
1

:明示的なjoin句を使用する方がよいでしょう。だから、クエリは一つだけが参加する必要があります。

SELECT g.id, g.creation_date, g.type, COUNT(*) as users_count_per_group 
FROM `group` g JOIN 
    user_group ug 
    ON g.id = ug.group_id 
GROUP BY g.id, g.creation_date, g.type; 

加算ノートを:それはSQLのキーワードであるため

  • groupは、テーブルのための本当に悪い名前です。私はテーブルを複数形で表記しますが、これは一般的にこの問題を回避します。
  • テーブルのエイリアスを使用すると、クエリの書き込みと読み取りが容易になります。
  • バッククォートは、クエリの書き込みと読み取りをより困難にします。
1

:これを試してみてください

SELECT `group`.`ID`, `group`.`creation_date`, `group`.`type`, COUNT(*) 
FROM  `group` 
JOIN  `user_group` ON `group`.`ID` = `user_group`.`group_id` 
JOIN  `user` ON `user`.`ID` = `user_group`.`user_id` 
GROUP BY `group`.`ID`, `group`.`creation_date`, `group`.`type` 
関連する問題