0

私はビデオゲームのインベントリ Web サイトに取り組んでいます。これは、いくつかのサンプルデータとともに、私のデータベーステーブルの簡略化されたバージョンです:

CREATE TABLE `platforms` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(16) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `platforms` VALUES(1, 'Nintendo');
INSERT INTO `platforms` VALUES(2, 'Super Nintendo');
INSERT INTO `platforms` VALUES(3, 'Nintendo 64');

--

CREATE TABLE `games` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `platform_id` int(10) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

INSERT INTO `games` VALUES(1, 1, 'Super Mario Bros.');
INSERT INTO `games` VALUES(2, 1, 'Super Mario Bros. 2');
INSERT INTO `games` VALUES(3, 2, 'Super Mario World');
INSERT INTO `games` VALUES(4, 2, 'Super Mario Kart');
INSERT INTO `games` VALUES(5, 3, 'Super Mario 64');
INSERT INTO `games` VALUES(6, 3, 'Mario Kart 64');

--

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(64) NOT NULL,
  `password` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `users` VALUES(1, 'john_doe', '$2a$10$cQhc4VAXVMEyC1tA.VRoWunpNVi7392adacT/weVBzu6XGI6.Jx/K');
INSERT INTO `users` VALUES(2, 'jane_doe', '$2a$10$Ot2BmlT14hKDxHGIV8jBx.lW76HCWdwuOhNGIYrJO5O7BEtDUWLWu');

--

CREATE TABLE `games_users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `game_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `games_users` VALUES(1, 1, 1, '2013-04-12 12:18:09');
INSERT INTO `games_users` VALUES(2, 3, 1, '2013-04-12 12:18:42');
INSERT INTO `games_users` VALUES(3, 4, 1, '2013-04-12 12:19:13');
INSERT INTO `games_users` VALUES(4, 2, 2, '2013-04-12 12:19:32');

ご覧のとおり、john_doe には 1 つの任天堂のゲーム (スーパー マリオ ブラザーズ)、2 つのスーパー ファミコンのゲーム (スーパー マリオ ワールドとスーパー マリオ カート)、および 0 のニンテンドー 64 のゲームがあります。jane_doe には、任天堂のゲーム (スーパーマリオブラザーズ 2) が 1 件、スーパーファミコンのゲームが 0 件、Nintendo 64 のゲームが 0 件あります。

すべてのコンソールを一覧表示し、各コンソールでユーザーが持っているゲームの数も一覧表示する、ユーザー固有のクエリを作成したいと考えています。

john_doe の結果は次のようになります。

platform.id: 1
platform.name: Nintendo
game_count: 1

platform.id: 2
platform.name: Super Nintendo
game_count: 2

platform.id: 3
platform.name: Nintendo 64
game_count: 0

jane_doe の結果は次のようになります。

platform.id: 1
platform.name: Nintendo
game_count: 1

platform.id: 2
platform.name: Super Nintendo
game_count: 0

platform.id: 3
platform.name: Nintendo 64
game_count: 0

これどうやってするの?

4

2 に答える 2

3
SELECT p.id, p.name, IFNULL(t.cnt, 0)
FROM platforms p
LEFT JOIN (
  SELECT g.platform_id as 'id', COUNT(g.id) as cnt
  FROM users u
  JOIN games_users gu ON gu.user_id = u.id
  JOIN games g ON g.id = gu.game_id
  WHERE u.username = "jane_doe"
  GROUP BY g.platform_id
  ) t ON t.id = p.id

デモ

于 2013-04-16T05:48:04.313 に答える