0

我有两张桌子:

  1. que - 包含bot_idplayer_id
  2. bot_inventory - 包含bot_iditem_id

我希望从查询中得到的输出是一个由 bot_id 分组的列表,它有一个列 count( player_id) 和另一个 count(`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`  

但它并不正确:/任何帮助将不胜感激!

4

1 回答 1

3

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

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

COUNT(DISTINCT q.player_id) as players,

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

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

GROUP BY que.bot_id

(这是 juergen d 在他的回答中指出的问题,一开始我错过了。)

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

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
于 2013-07-12T15:07:55.710 回答