我有两张桌子:
bot_id
和player_id
bot_id
和item_id
我想从查询输出的是一个按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`
但它不是正确的:/任何帮助都会非常感激!
答案 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