MySql通过表中的连接获取count(*)

时间:2014-07-31 04:56:56

标签: php mysql

大多数人无法思考该怎么做,

我有两个数据库表。比如table_employee和table_workorder

每个员工都有一个/多个工作单。

早些时候我正在使用查询,一个用于从table_employee获取员工元组,另一个查询用于每个员工工作单计数。

SELECT * from table_employee order by " . $orderBy ." desc"
SELECT count(*) as wcount from table_workorder where employeeid = " . $table_employee.id;

我意识到没有2个DB调用,有一个可以获取结果的单个调用会很好,但是我无法构建查询框架。尝试在MySql中加上PHP

1 个答案:

答案 0 :(得分:2)

SELECT t1.*, IFNULL(COUNT(t2.employeeid), 0) AS wcount
FROM table_employee AS t1
LEFT JOIN table_workorder AS t2 ON t2.employeeid = t1.id
GROUP BY t1.id
ORDER BY $orderBy DESC

您需要使用LEFT JOIN,以便为没有工单的员工提供行。

以下是其工作原理:

  1. JOIN在两个表之间创建一个交叉产品,使用ON t2.employeeid = t1.id条件关联它们。
  2. 由于它是LEFT JOIN,第一个表中第二个表中没有匹配行的任何行都将放在结果集中,第二个表中的所有列都将NULL。< / LI>
  3. 它按t1.id列对这些结果进行分组,因此每个组的最终结果中都会有一行。
  4. 对于每个组,它会计算具有非空t2.employeeid的所有行。如步骤2中所述,没有匹配工单的员工将获得NULL t2.employeeid,因此不会计算在内。
  5. 由于如果未找到任何内容,此计数将为NULL,我们会使用IFNULL将其转换为0以获得更有用的结果。
  6. 最终结果按$orderBy列排序。
  7. 这正是您的查询序列所做的事情,但它都是在一个SQL查询中完成的。

    这是关于SQL JOIN的一个很好的教程:

    http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/