【问题标题】:Get the COUNT(*) in the case with 'JOIN and WHERE'在 'JOIN and WHERE' 的情况下获取 COUNT(*)
【发布时间】:2015-02-11 05:43:21
【问题描述】:

一共有三个表,它们之间的关系:

“任务”由“雇主(uid)”创建

'Execution'由'employee(uid)'完成并匹配'task(tid)'

表 1 - 任务

时间 |姓名 |雇主 =========================== 1 |世界你好 | 1 2 |吃东西 | 1 3 |游泳 | 2

表 2 - 用户

uid |姓名 ============== 1 |三文鱼 2 |鸟 3 |猪

表 3 - 执行

开斋节 |任务 |员工 ======================= 1 | 1 | 2 2 | 1 | 2 3 | 2 | 3 4 | 1 | 3 5 | 2 | 2

然后我做一些查询。

SELECT T1.tid,
    T1.name AS taskName,
    T1.employer AS employerUid,
    T2.name AS employerName,
    COUNT(T3.*)
FROM task T1, user T2, execution T3
WHERE T1.employer = T2.uid
    AND T1.tid = T3.task
    AND T1.tid = ( Here can input the task id )

我的问题:

我输入'T1.tid = 1'查询,我想得到COUNT()的结果是'3'

开斋节 |任务 |员工 ======================= 1 | 1 | 2----我要 2 | 1 | 2----我要 3 | 2 | 3 4 | 1 | 3----我要 5 | 2 | 2

但是SQL总是返回'5',我猜'5'是表执行的总行数。

在上述情况下如何获取COUNT


谢谢大家。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    使用 JOIN 而不是试图将所有内容都塞进 WHERE 子句中。

    SELECT T1.tid,
        T1.name AS taskName,
        T1.employer AS employerUid,
        COUNT(*)
    FROM task T1
    JOIN execution T3 ON T3.task = T1.tid
    JOIN user T2 ON T3.eid = T2.uid
    WHERE T1.tid = ( Here can input the task id )
    

    请注意,您可以完全不使用 JOIN 用户 T2,因为它在您计算时不相关。另外我在计数时省略了显示员工编号,因为会有很多这样的员工。如果需要,您还可以将 WHERE 更改为 GROUP BY 并在单个查询中显示所有 tid 的计数。

    【讨论】:

      【解决方案2】:

      试试这个

      select T1.tid as task, count(T2.id) as employee 
      from task T1
          inner join execution T3 on T3.task = T1.tid
          inner join employee T2 on T3.employee = T2.eid
      group by T1.id
      order by T1.id;
      

      我假设您要计算员工 T2 而不是执行 T3?

      抱歉,如果有错字,我目前无法访问 MySQL

      【讨论】:

        【解决方案3】:

        只要您在选择中有一个聚合函数(如 COUNT),您就必须包括您希望如何对要聚合的记录进行分组。通常,您的查询没有 GROUP BY 子句这一事实会产生错误,而不是奇怪的结果。也许 MySQL 在这方面更宽容。

        按 T3.task 分组

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-28
          • 2023-03-04
          • 1970-01-01
          • 2011-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多