使用 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一起用,比如不同组合的人数?