【问题标题】:Outer join not giving expected result外部联接未给出预期结果
【发布时间】:2017-09-07 09:38:00
【问题描述】:

我有三个表,我想计算每个表中每个度假村的记录数。我得到了一个我无法解释的意外结果。

我的表格如下:

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);

我的查询:

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  8   8   8   
68  82  0   0   0   
62  69  0   0   1   
59  66  0   0   0   
60  67  1   0   1   

但我希望:

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

【问题讨论】:

  • 可以添加game_resorts的数据吗?
  • 测试它,我会添加它作为答案。当然,解释原因
  • 不幸的是,我得到与您的更改相同的结果。我在原始帖子中添加了我的表格
  • 现在我看到数据我知道问题了。我现在很忙...如果没有人回答你我会...底线,你必须计算每张桌子,你现在的做法是只计算度假村的注册表
  • @JorgeCampos 感谢您的提示!

标签: mysql codeigniter join


【解决方案1】:

您遇到的主要问题是您的表game_items 有多个game_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

编辑:我没有偷懒,而是继续对所有剩余的表进行计数。

编辑:修复了最后一个子查询以更正@remyremy 所述的表

【讨论】:

  • 成功了,谢谢!最后一个 Join 末尾的小错字:GROUP BY game_slopes 应该是 GROUP BY game_staff。我的原始代码是使用 PHP 和 ActiveRecord,有没有简单的方法可以将上面的 SQL 直接转换为 ActiveRecord 查询?在线转换器之类的...
  • 没有足够的 PHP 经验,也许其他人可以帮助你。
  • 也感谢您指出答案中的错误,现已修复。
  • @remyremy 快速谷歌搜索提出了这个stackoverflow.com/questions/23125261/… 指向网站scuttle.io 再次没有 PHP 经验,但看起来合法
猜你喜欢
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 2012-08-05
  • 2017-01-13
  • 2021-09-15
  • 2016-01-30
相关资源
最近更新 更多