【问题标题】:How to filter the result MysqlMysql如何过滤结果
【发布时间】:2017-05-03 06:35:38
【问题描述】:

很难描述我想要什么,但我会尝试: 首先,我有两张表:员工和薪水。我通过这个 SQL 命令加入了 2 个表:

"SELECT employee.id, employee.employee_name, employee.image, salary.year, salary.month, salary.day, salary.total_salary, salary.id, salary.created
                        FROM employee
                 JOIN salary ON salary.employee_id=employee.id"

获取我插入的所有值,执行后,我得到:

Created              name    year     month   day(working)       total_salary
------------------------------------------------------------------------------
2016-12-17 20:41      A      2016       1         31              1550000
2016-12-17 21:49      A      2016       1         20              2000000
2016-12-17 22:49      A      2016       2         20              2000000
2016-12-18 22:43      B      2016       2         15              1550000
2016-12-18 23:43      B      2016       2         10              1000000
2016-12-18 23:49      B      2016       2         1                100000

之后,我想获取每个月的最新值,所以我在上面的 sql 末尾添加了这个命令:

 GROUP BY employee.employee_name, salary.year, salary.month"

得到了这个:

Created              name    year     month   day(working)       total_salary
------------------------------------------------------------------------------
2016-12-17 20:41      A      2016       1         31              1550000
2016-12-17 22:49      A      2016       2         20              2000000
2016-12-18 22:43      B      2016       2         15              1550000

什么查询会返回以下结果?

Created              name    year     month   day(working)       total_salary
------------------------------------------------------------------------------
2016-12-17 21:49      A      2016       1         20              2000000
2016-12-17 22:49      A      2016       2         20              2000000
2016-12-18 23:49      B      2016       2         1                100000

【问题讨论】:

  • 我有点困惑,您想按month 对它们进行分组,但在您想要的输出中有两个相同的month,这似乎是矛盾的。
  • 你可以看到每个员工有很多个月,我只想显示一个员工的每个月。看起来有点复杂:))
  • 如果您放置实际表,则对测试查询更有帮助。如果没有,我可以说您只需编写子查询来计算每个员工的总数,然后将其加入主表。

标签: php mysql sql web


【解决方案1】:

在分组之前,您应该按创建日期对条目进行排序,最新条目排在第一位:

ORDER BY salary.created DESC

更改第一个查询(您必须删除其中一个 id 或为其设置别名,因为您将有两列同名):

SELECT employee.id as employee_id, employee.employee_name, employee.image, salary.year, salary.month, salary.day, salary.total_salary, salary.id, salary.created 
FROM employee JOIN salary ON salary.employee_id=employee.id 
ORDER BY salary.created DESC 

所以最后创建的首先显示。然后像你一样对结果进行分组:

SELECT * FROM (
    SELECT employee.id as employee_id, employee.employee_name, employee.image, salary.year, salary.month, salary.day, salary.total_salary, salary.id, salary.created
    FROM employee
    JOIN salary ON salary.employee_id=employee.id 
    ORDER BY salary.created DESC 
) as employee_salary 
GROUP BY employee_salary.employee_name, employee_salary.year, employee_salary.month

【讨论】:

  • 感谢您的帮助,但它仍然对我不起作用:(,结果仍然与我上面描述的相同
  • 你能把那两张桌子的转储发给我吗?或者只是一些我可以玩的示例数据?我创建了 2 个表,并通过我的查询得到了我认为你想要的结果...
【解决方案2】:

我的出发点是在您加入之后,我刚刚制作了一个表格,其中包含您的第一个结果。

使用此查询:

SELECT created, name, year, month, day, total_salary FROM 
( SELECT * FROM employees
  ORDER BY created DESC
) AS sub
GROUP BY name, month, year;

我已经得到了你想要的结果:

Created              name    year     month   day(working)       total_salary
------------------------------------------------------------------------------
2016-12-17 21:49      A      2016       1         20              2000000
2016-12-17 22:49      A      2016       2         20              2000000
2016-12-18 23:49      B      2016       2         1                100000

基本上,诀窍是在使用 GROUP BY
将它们打包成组之前处理排序 所以我做了一个只处理排序的子查询。这个post 帮助我弄清楚了如何做到这一点。

这是一个Fiddle,您可以在其中玩耍并调整它以适应您的起始查询。

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2011-10-05
    相关资源
    最近更新 更多