【问题标题】:MySQL count rows include zero (so close to what I want!)MySQL 计数行包括零(非常接近我想要的!)
【发布时间】:2012-06-04 11:37:11
【问题描述】:

我知道我已经很近了,它正在杀死我。这里需要一双新的眼睛......

SELECT 
first_name, 
COUNT(*) FROM 
(SELECT first_name, job_status FROM typesetting 
LEFT JOIN employees ON typesetting.employees_id = employees.id 
LEFT JOIN job_status ON typesetting.job_status_id = job_status.id 
WHERE job_status NOT LIKE 'Archived' 
ORDER BY first_name ASC) 
AS CNT 
GROUP BY first_name

这让我明白了:

  • 阿诺德 (5)
  • 克劳迪娅 (19)
  • 珍妮特 (29)
  • 丰富 (21)
  • 汤姆 (4)
  • 未分配 (24)

但是,有一些结果中的值为零,我迫切希望在结果中出现,像这样:

  • 阿诺德 (5)
  • 谢丽尔 (0)
  • 克劳迪娅 (19)
  • 辛迪 (0)
  • 珍妮特 (29)
  • 菲尔 (0)
  • 丰富 (21)
  • 汤姆 (4)
  • 未分配 (24)

我做错了什么?很近!谢谢!

-马特

【问题讨论】:

    标签: mysql join count


    【解决方案1】:
    SELECT  first_name, COUNT(js.id)
    FROM    employees e
    LEFT JOIN
            typesetting ts
    ON      ts.employees_id = e.id
    LEFT JOIN
            job_status js
    ON      js.id = ts.job_status_id
            AND js.status <> 'Archived'
    GROUP BY
            first_name
    UNION ALL
    SELECT  'Unassigned', COUNT(*)
    FROM    typesetting ts
    JOIN    job_status js
    ON      js.id = ts.job_status_id
            AND js.status <> 'Archived'
    WHERE   ts.employees_id NOT IN
            (
            SELECT  id
            FROM    employees
            )
    

    【讨论】:

      【解决方案2】:

      在 INNER 查询中,你过滤掉所有的人,这可能会给你0 结果。

      试试这个:

      SELECT first_name,
             sum(CASE WHEN job_status = 'Archived' THEN 1 ELSE 0 END) AS cnt
        FROM typesetting 
        LEFT JOIN employees ON typesetting.employees_id = employees.id 
        LEFT JOIN job_status ON typesetting.job_status_id = job_status.id 
      GROUP BY first_name
      ORDER BY first_name ASC;
      

      【讨论】:

      • 我刚刚将 job_status 'Archived' 的 = 更改为 ,因为我想排除已存档的记录。除此之外,这似乎正是我想要的。非常感谢!
      【解决方案3】:

      如果我的问题正确。你可以这样做:

      SELECT
          employees.first_name,
          (
              SELECT
                  COUNT(*)
              FROM
                  typesetting
                  JOIN job_status ON typesetting.job_status_id = job_status.id 
              WHERE
                  typesetting.employees_id = employees.id
                  AND job_status NOT LIKE 'Archived' 
          )
      FROM
          employees
      ORDER BY 
          first_name ASC
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-09
        • 2012-06-29
        • 1970-01-01
        • 2020-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多