2017-04-11 9 views
3

私は3つのテーブルを持っており、それぞれのテーブルの各リゾートのレコード数を数えたいと思います。私は私が説明できない予期せぬ結果を得ている。外部結合は期待された結果を与えていません

私のテーブルは以下のとおりです。

CREATE TABLE `game_items` (
    `id_items` int(11) NOT NULL, 
    `id_resort` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
INSERT INTO `game_items` (`id_items`, `id_resort`) VALUES 
(36, 81), 
(38, 81), 
(39, 67); 

CREATE TABLE `game_slopes` (
    `id_slopes` int(11) NOT NULL, 
    `id_resort` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
INSERT INTO `game_slopes` (`id_slopes`, `id_resort`) VALUES 
(16, 81); 

CREATE TABLE `game_staff` (
    `id_staff` int(11) NOT NULL, 
    `id_resort` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
INSERT INTO `game_staff` (`id_staff`, `id_resort`) VALUES 
(1, 69), 
(3, 67), 
(5, 81), 
(7, 81), 
(8, 81), 
(12, 81); 

CREATE TABLE `game_resorts` (
    `id_resort` int(11) NOT NULL, 
    `id_player` int(11) DEFAULT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
INSERT INTO `game_resorts` (`id_resort`, `id_player`) VALUES 
(66, 59), 
(67, 60), 
(68, 61), 
(69, 62), 
(70, 63), 
(81, 67), 
(82, 68); 

そして、私のクエリ:

id_player id_resort item_count slope_count  staff_count  
61 68 0 0 0 
63 70 0 0 0 
67 81 8 8 8 
68 82 0 0 0 
62 69 0 0 1 
59 66 0 0 0 
60 67 1 0 1 

しかし、私は期待:

SELECT `game_players_tbl`.`id_player`, `game_resorts`.`id_resort`, 
COUNT(game_items_tbl.id_items) as item_count, 
COUNT(game_slopes_tbl.id_slopes) as slope_count, 
COUNT(game_staff_tbl.id_staff) as staff_count 
FROM `game_resorts` 
INNER JOIN `game_players` as `game_players_tbl` ON `game_resorts`.`id_player` = `game_players_tbl`.`id_player` 
LEFT OUTER JOIN `game_items` as `game_items_tbl` ON `game_resorts`.`id_resort` = `game_items_tbl`.`id_resort` 
LEFT OUTER JOIN `game_slopes` as `game_slopes_tbl` ON `game_resorts`.`id_resort` = `game_slopes_tbl`.`id_resort` 
LEFT OUTER JOIN `game_staff` as `game_staff_tbl` ON `game_resorts`.`id_resort` =`game_staff_tbl`.`id_resort` 
GROUP BY `game_resorts`.`id_resort` 
ORDER BY `game_resorts`.`reputation` DESC 

結果が

id_player id_resort item_count slope_count  staff_count  
61 68 0 0 0 
63 70 0 0 0 
67 81 2 1 4 
68 82 0 0 0 
62 69 0 0 1 
59 66 0 0 0 
60 67 1 0 1 

私はリゾートID 81の各カウントで8を取得する理由を理解していません。私はさまざまな方法を試しましたが、正しい結果を得ることはありません。

編集:追加されましたgame_resorts

+0

で述べたように、テーブルを修正するために、最後のサブクエリを修正しますか? –

+0

これをテストして、私はそれを答えとして追加します。そして、もちろん、理由を説明してください –

+0

残念ながら私はあなたの変更で同じ結果を得ています。私は元のポストに私のテーブルを追加しました – remyremy

答えて

1

あなたが持っている主な問題はgame_itemsgame_resortsのための倍数の記録を持っているあなたのテーブルです。これにより、game_resortsテーブルに結合されたすべてのデータが複製されます。 @Jorge Camposが述べたように、各テーブルごとに別々のカウントを作成し、それらをあなたのリゾートテーブルに参加させるのが最善でしょう。

SQLクエリ

SELECT `game_players_tbl`.`id_player`, `game_resorts`.`id_resort`, 
game_items_tbl.Count AS item_count, 
game_slopes_tbl.Count AS slope_count, 
game_staff_tbl.Count AS staff_count 
FROM `game_resorts` 
INNER JOIN `game_players` AS `game_players_tbl` ON `game_resorts`.`id_player` = `game_players_tbl`.`id_player` 
LEFT OUTER JOIN (
    SELECT `game_items`.`id_resort`, COUNT(`game_items`.`id_items`) AS Count FROM `game_items` GROUP BY `game_items`.`id_resort` 
) AS `game_items_tbl` ON `game_resorts`.`id_resort` = `game_items_tbl`.`id_resort` 
LEFT OUTER JOIN (
    SELECT `game_slopes`.`id_resort`, COUNT(`game_slopes`.`id_slopes`) AS Count FROM `game_slopes` GROUP BY `game_slopes`.`id_resort` 
) AS `game_slopes_tbl` ON `game_resorts`.`id_resort` = `game_slopes_tbl`.`id_resort` 
LEFT OUTER JOIN (
    SELECT `game_staff`.`id_resort`, COUNT(`game_staff`.`id_staff`) AS Count FROM `game_staff` GROUP BY `game_staff`.`id_resort` 
) AS `game_staff_tbl` ON `game_resorts`.`id_resort` =`game_staff_tbl`.`id_resort` 
GROUP BY `game_resorts`.`id_resort` 
ORDER BY `game_resorts`.`reputation` DESC 

編集:代わりに怠けているのは、私は先に行って、カウントを残りのすべてのテーブルを行いました。

編集:あなたがgame_resortsのデータを追加することができますしてください@remyremy

+0

これを今すぐテストしてください – remyremy

+0

それはうまくいきました!最後のJoin:GROUP BY game_slopes'の最後にある小さなタイプミスは、GROUP BY game_staff'でなければなりません。私のオリジナルコードはPHPとActiveRecordを使用していますが、上記のSQLをActiveRecordクエリに直接変換する簡単な方法はありますか?オンラインコンバータやそのような... – remyremy

+0

十分なPHPの経験は、多分誰かがあなたを助けることができます。 –

関連する問題