使用 count 和 group_concat 编写 SQL 代码

Posted

技术标签:

【中文标题】使用 count 和 group_concat 编写 SQL 代码【英文标题】:Writting SQL code with using count and gorup_concat 【发布时间】:2016-07-16 21:52:54 【问题描述】:

我已经阅读了每个标题相似的帖子,但没有找到正确的答案。 我真正需要做的是从 mysql 表中计算一些数据,然后执行 group_concat,因为我得到了不止一行。 我的桌子是这样的 这是我尝试运行查询的方式

SELECT 
    count(cal.day) * 8,
    w.name
    FROM claim as c 
    RIGHT JOIN calendar as cal ON c.id = cal.claim_id
    RIGHT JOIN worker as w ON c.worker_id = w.id
    GROUP BY c.id
    ORDER BY w.name asc

但是我为一些工人获得了不止一排,由于 count(),我无法对他们进行 group_concat。我需要这个用于我制作的mysql程序,所以如果可以的话请帮助我。 我希望我已经给了你足够的信息

为迪伦编辑:

查看输出的差异 按 w.id 分组

按 c.id 分组

【问题讨论】:

删除sql-server标签 为什么是GROUP BY c.id,而不是GROUP BY w.id @DylanSu 看到编辑的差异一位用户有几个月或一个月。 GROUP BY w.id 的结果似乎更合理。 想要的结果是什么?用简单的英语,目标是什么? 【参考方案1】:

MySQL 不允许两个聚合函数一起使用,例如GROUP_CONCAT(COUNT(...))

因此,我们可以使用sub-query 来解决如下问题。

SELECT
    GROUP_CONCAT(t.cnt_cal_day) as cnt_days,
    t.name
FROM
( 
    SELECT 
        count(cal.day) * 8 as cnt_cal_day,
        w.name
    FROM claim as c 
    RIGHT JOIN calendar as cal ON c.id = cal.claim_id
    RIGHT JOIN worker as w ON c.worker_id = w.id
    GROUP BY c.id
    ORDER BY w.name asc
) t

【讨论】:

虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案2】:

虽然我还不清楚这个问题,但我试着猜测你需要什么。

这个查询:

SELECT 
    w.name,
    COUNT(cal.day) * 8 AS nb_hours
FROM worker w
  LEFT JOIN claim c ON w.id = c.worker_id
  INNER JOIN calendar cal ON c.id = cal.claim_id
GROUP BY w.id
ORDER BY w.name ASC

返回所有工人的姓名,以及为每个工人批准的假期小时数。

如果您改用LEFT JOIN calendar,您将获得每位员工申请的假期小时数(已批准和未批准)。为了将它们分开,您应该像这样进行查询:

SELECT 
    w.name,
    c.approved,           # <---- I assumed the name of this field
    COUNT(cal.day) * 8 AS nb_hours
FROM worker w
  LEFT JOIN claim c ON w.id = c.worker_id
  LEFT JOIN calendar cal ON c.id = cal.claim_id
GROUP BY w.id, c.approved
ORDER BY w.name ASC

此查询应为每个工作人员返回 1 或 2 行,具体取决于他们拥有的休假申请类型(无、仅批准、仅未批准、两者都有)。对于没有任何休假申请的工人,查询在approved 列中返回NULL,在nb_hours 列中返回0

【讨论】:

以上是关于使用 count 和 group_concat 编写 SQL 代码的主要内容,如果未能解决你的问题,请参考以下文章

Impala/SQL - 可以利用 GROUP_CONCAT 和 COUNT > 1 的查询

Mysql count group_concat 高级用法(count 过滤条件,group_concat过滤条件)

MySQL:带有 ORDER BY COUNT 的 GROUP_CONCAT?

实用sql函数group_conca我知道你想group_concat和count一起用,比如不同组合的人数?

在 Django 中使用 GROUP_CONCAT 和其他注释

在 group_concat 中排序