gpt4 book ai didi

mysql - 如何根据MySQL中子查询结果的组合选择特定值

转载 作者:行者123 更新时间:2023-11-29 03:32:06 27 4
gpt4 key购买 nike

假设下面的 MyTable:

----------------------------------------
employee_id task_id Subtask_id name pager checked
----------------------------------------
1 124 1 Jackson 555 2015-05-10
1 124 2 Jackson 555 2015-06-10
1 124 3 Jackson 555 NULL
2 789 1 Nancy 333 2015-05-10
3 222 1 Jane 555 NULL
3 963 1 Jane 555 NULL
1 422 1 Jackson 555 2015-06-10
----------------------------------------

我在 MySQL 中写了这个查询:

SELECT employee_id, task_id, Name, Pager, if(count(Q.employee_ID) > 1,"Incomplete",if(Q.BoolChecked = 0,"None", "Done") AS STATUS
FROM (
SELECT employee_ID, task_id, Name, Pager, if(Checked IS NULL,0,1) AS BoolChecked
FROM MyTable
GROUP BY task_id, BoolChecked
) AS Q
GROUP BY Q.task_id

结果是这样的:

----------------------------------------
employee_id task_id name pager checked
----------------------------------------
1 124 Jackson 555 Incomplete
1 422 Jackson 555 Done
2 789 Nancy 333 Done
3 222 Jane 555 None
3 963 Jane 555 None

我无法实现并需要帮助的最终目标是按 employee_id 分组并获得以下结果:

--------------------------------
employee_id name pager checked
--------------------------------
1 Jackson 555 Incomplete
2 Nancy 333 Done
3 Jane 555 None

总结:每个 employee_id 如果所有任务都已完成,则显示“完成”。如果所有任务都没有完成,则显示“无”。任何组合显示不完整"

  • 问题 1:我怎样才能达到最终结果?
  • 问题 2:对我已有的查询有任何性能评价吗?

非常感谢您的帮助。

最佳答案

count(*) 计算所有行,而 count(expression) 计算 expression IS NOT NULL 的行。因为您实际上需要的是 expression IS NULL 的行数 - 最简单的方法是将这两个值相减。试试这个:

SELECT
`employee_id`, `name`, `pager`
, CASE
WHEN (count(*) - count(`checked`)) > 0 THEN 'Incomplete'
ELSE 'done'
END AS checked
FROM MyTable
GROUP BY `employee_id`, `name`, `pager`

这是文件:http://sqlfiddle.com/#!9/df620/3

第二件事:假设“nancy”只有未完成的任务——您为什么要将她标记为“无”?要做到这一点,您需要重新设计架构。将您的表格分成两部分:“员工”和“任务”。然后你可以进行左连接——如果某个员工没有行——那么你可以将他标记为“NONE”。如果您真的想要按自己的方式进行 - 您可以尝试以下查询:

SELECT
`employee_id`, `name`, `pager`
, CASE
WHEN max(`checked`) IS NULL AND min(`checked`) IS NULL THEN 'none'
WHEN (count(*) - count(`checked`)) > 0 THEN 'Incomplete'
ELSE 'done'
END AS checked
FROM MyTable
GROUP BY `employee_id`, `name`, `pager`

还有一个 fiddle :http://sqlfiddle.com/#!9/df620/5

关于mysql - 如何根据MySQL中子查询结果的组合选择特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29272547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com