【问题标题】:Mysql join counting rows from another tableMysql join 计算另一个表中的行数
【发布时间】:2011-05-16 12:51:08
【问题描述】:

我无法根据主表中行的两个不同条件从特定表中获取行数:

主要是,我有一张供玩家使用的表格,其中包含简单的信息,例如玩家姓名和 ID。 我还有一个动作表,其中列出了每个球员的动作类型(进球或助攻)。我想让所有球员在一个栏目中计算他们的进球数,另一个栏目计算他们的助攻数。当然,我想要那些没有进球、没有助攻的懒惰球员。

现在我提出了这个要求,但它只给了我最好的玩家,而我想要所有的玩家。请点亮我的心灵;)

SELECT
  `p`.`playername`, 
  COUNT(`a1`.`actionid`) AS `goals`, 
  COUNT(`a2`.`actionid`) AS `assists`

FROM `Player` AS `p`

LEFT JOIN `Actions` AS `a1` 
ON `a1`.`id` = `p`.`id`

LEFT JOIN `Actions` AS `a2` 
ON `a2`.`id` = `p`.`id`

WHERE `a1`.`type` = 'goal'
  AND `a2`.`type` = 'assist'

GROUP BY  
  `a1`.`userId`,  
  `a2`.`userId` 

LIMIT 0 , 30

【问题讨论】:

  • 我认为您可能需要调整示例 SQL .. 这似乎无效。两个表具有相同的引用 ('a'),并且有一个 'r2' 和 'a2' 似乎与任何东西无关。
  • 你说得对,我留下了一些错误,应该更好吗?

标签: mysql


【解决方案1】:

我在您的查询中注意到,您加入 actions 表的条件是引用别名为 u 的表,您没有为其分配任何表。所以,我认为您的查询可能会引发 MySQL 错误。此外,在您的连接条件中,您引用了Actions 表的id 字段,在正常约定下,我希望它是一个主要的自动增量键。您可能将其用作玩家 ID,我不确定,但为了更详细,我将其更改为 player_id,以便您和其他人确切知道下面的查询中发生了什么。假设您在 SO 编辑器中将查询编辑为“更易于阅读”并且没有对其进行测试,我将其调整为我认为更准确的内容。

当连接表并在选择上运行COUNT 时,您只能计算返回的总行数。您不能根据 JOIN 中单个表返回的行数来COUNT。如果您绝对必须使用COUNT,则必须运行多个查询(每个需要运行的COUNT 1 个)或使用运行COUNT 的子查询来满足您正在寻找的特定条件。

此查询可以作为单个查询运行,但COUNT 不是解决方案。您使用CASESUM 的组合。我们运行CASE..WHEN 子句来测试每一行以查看已加入的动作是进球还是助攻。如果是目标,我们给goals 列赋值1,如果是辅助,我们给assists 列赋值1。然后我们运行一个聚合函数(SUM)来添加为goalsassistsGROUP BY 玩家ID 加1。这为每个球员提供了一个单行,其中包含他们获得的总进球数和助攻数,即使是得分为 0 的球员也是如此。

SELECT 
    p.payername, 
    SUM(CASE a.type WHEN 'goal' THEN 1 ELSE 0 END) goals, 
    SUM(CASE a.type WHEN 'assist' THEN 1 ELSE 0 END) assists
FROM Player p
LEFT JOIN Actions a ON a.player_id = p.id
GROUP BY p.id
LIMIT 0, 30

我希望这对您有所帮助并且对您有意义。如果您仍然感到困惑,可以查看CASE 的文档以获得更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-17
    • 2014-08-29
    • 1970-01-01
    • 2019-03-06
    • 2021-07-22
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多