使用INNER JOIN,GROUP BY和Max的MySql查询

时间:2016-07-04 13:51:22

标签: php mysql sql group-by max

我有两个表,一个看起来像这样:

ID, Datetime, User_ID, Location and Status // the rest is not relevant

另一个看起来像这样:

 ID, Lastname // the rest is not relevant

现在,我只希望获得第一个表格的条目,其中每个Datetime的{​​{1}}最高User_ID,并向另一个表格询问lastname的{​​{1}}。简单...

我试过这种方式(看起来最有希望,但却是假的):

User_ID

有人可以给我一个提示吗?我现在真的被困在这一段时间了,现在我开始在脑中得到一些结...... :(

2 个答案:

答案 0 :(得分:2)

你非常接近,实际上:

SELECT w.Datetime, w.User_ID, w.Status, e.Lastname
FROM worktimes w INNER JOIN
     employees e 
     ON w.User_ID = e.ID LEFT JOIN
     (SELECT max(Datetime) AS Datetime, User_ID
      FROM worktimes 
      WHERE Datetime > 1467583200 AND Location = '16' 
      GROUP BY User_ID
     ) ww
     ON ww.User_ID = w.User_ID AND w.DateTime = ww.DateTime
ORDER BY e.Nachname;

注意:

  • 您需要加入DateTime值。
  • RIGHT JOIN是不必要的。我用LEFT JOIN替换了它,但我不确定这是你想要的。您可以从INNER JOIN开始,看看它是否能产生您想要的效果。
  • 在大多数情况下,不要在子查询中使用ORDER BY
  • 您不需要外部查询中的GROUP BY

答案 1 :(得分:1)

您所询问的内容称为correlated subqueries。在标准SQL中,可以使用APPLYLATERAL构造来实现。不幸的是,并非所有RDBMS都支持这些优雅的解决方案。例如,MSSQLOraclePostgresql的最新版本具有这些结构,但 MySQL 不具备这些结构。恕我直言,这对MySQL用户来说是一个真正的痛苦,因为近年来MySQL开始倾向于标准,但是以某种奇怪的方式 - 默认情况下它会关闭其非标准的黑客攻击,但是没有实现标准对应物。例如,你的问题中提出的你自己的查询在最近的MySQL版本中默认不起作用,因为不再支持子查询中的排序,为了使它工作你必须使用一些讨厌的黑客 - 添加LIMIT some_really_big_number到子查询。