【问题标题】:Get total count of records with a mysql join and 2 tables获取具有 mysql 连接和 2 个表的记录总数
【发布时间】:2015-10-14 07:14:29
【问题描述】:

我有 2 个要加入的表,但我不确定如何使其最省时。

任务表:

nid | created_by | claimed_by | urgent
1   |     11     |     22     |   1
2   |     22     |     33     |   1
3   |     33     |     11     |   1
1   |     11     |     43     |   0
1   |     11     |     44     |   1

员工表:

userid | name
  11   |  EmployeeA
  22   |  EmployeeB
  33   |  EmployeeC

我想得到的结果:

userid | created_count | claimed_count | urgent_count
  11   |       3       |       1       |       3
  22   |       1       |       1       |       2
  33   |       1       |       1       |       2

created_account 列将显示该用户创建的任务总数。

claimed_count 列将显示该用户声明的任务总数。

urgent_count 列将显示该用户的紧急任务总数(创建或声明)。

提前致谢!

【问题讨论】:

  • 只需编写查询并测试它。然后,当它被证明太慢时,尝试对其进行优化。如果不成功,您可以发布您的尝试,连同表结构、索引、数据量和其他可能帮助我们找到您查询中的瓶颈的相关信息。目前这个问题不完整。

标签: mysql join left-join inner-join outer-join


【解决方案1】:

我会先把它分解成碎片,然后再把它们重新组合在一起。您可以像这样使用简单的聚合来获取 created_count 和 claim_count:

SELECT created_by, COUNT(*) AS created_count
FROM myTable
GROUP BY created_by;

SELECT claimed_by, COUNT(*) AS claimed_count
FROM myTable
GROUP BY claimed_by;

要获得每个员工的紧急计数,我会在员工是 created_by 或claim_by 列的条件下加入这两个表,并按员工分组。然而,我不会数数,而是使用SUM()。我这样做是因为看起来每一行都是 0 或 1,所以 SUM() 将有效地计算所有非零行:

SELECT e.userid, SUM(t.urgent)
FROM employee e
JOIN task t ON e.userid IN (t.created_by, t.claimed_by)
GROUP BY e.userid;

现在您已拥有所需的所有数据位,您可以使用外连接将所有这些子查询连接到员工表以获取它们的计数。您可以使用COALESCE() 函数将任何空计数替换为 0:

SELECT e.userid, COALESCE(u.urgent_count, 0) AS urgent_count, COALESCE(crt.created_count, 0) AS created_count, COALESCE(clm.claimed_count, 0) AS claimed_count
FROM employee e
LEFT JOIN(
  SELECT e.userid, SUM(t.urgent) AS urgent_count
  FROM employee e
  JOIN task t ON e.userid IN (t.created_by, t.claimed_by)
  GROUP BY e.userid) u ON u.userid = e.userid
LEFT JOIN(
  SELECT claimed_by, COUNT(*) AS claimed_count
  FROM task
  GROUP BY claimed_by) clm ON clm.claimed_by = e.userid
LEFT JOIN(
  SELECT created_by, COUNT(*) AS created_count
  FROM task
  GROUP BY created_by) crt ON crt.created_by = e.userid;

这是一个SQL Fiddle 示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多