跨两个表选择 - 不确定是否加入或联合?

时间:2013-07-12 14:53:30

标签: mysql

我有两张桌子:

  1. que - 包含bot_idplayer_id
  2. bot_inventory - 包含bot_iditem_id
  3. 我想从查询输出的是一个按bot_id分组的列表,它有一个列计数(player_id)和另一个计数(`item_id)。这应该只基于在que。中找到的bot_id。

    我已经开始了:

    SELECT `que`.`bot_id`,
           Count(`que`.`player_id`)         AS players,
           Count(`bot_inventory`.`item_id`) AS items
    FROM   `que`
           LEFT JOIN `bot_inventory`
                  ON `que`.`bot_id` = `bot_inventory`.`bot_id`
    ORDER  BY `que`.`bot_id`  
    

    但它不是正确的:/任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:3)

你说“它不是正确的”。我认为这意味着COUNT聚合返回的值大于您的预期。原因是来自que的行与来自bot_inventory的多行匹配,而COUNT聚合将计算行数,而不是不同的玩家。

如果(bot_id,player_id)在que表中是唯一的,那么对“玩家”计数的一个简单修复就是添加DISTINCT关键字:

COUNT(DISTINCT q.player_id) as players,

同样的模式适用于“项​​目”计数,如果它是唯一的。

实际上,您的查询似乎也缺少

GROUP BY que.bot_id

(这是juergen在他的回答中指出的问题,我起初错过了。)

否则,您可以重写查询以使用内联视图来获取计数,例如

SELECT q.bot_id
     , q.players
     , b.items
  FROM ( SELECT p.bot_id, COUNT(p.player_id) AS players
           FROM que p
          GROUP BY p.bot_id
       ) q
  LEFT
  JOIN ( SELECT d.bot_id, COUNT(d.item_id) AS items
           FROM bot_inventory d
          GROUP BY d.bot_id
       ) b
    ON b.bot_id = q.bot_id
 ORDER BY q.bot_id