Php MySQL,GroupBy OrderBy

Php MySQL,GroupBy OrderBy,php,mysql,group-by,sql-order-by,greatest-n-per-group,Php,Mysql,Group By,Sql Order By,Greatest N Per Group,你可能会问的第一个问题是,有多少分组/按顺序提问?很多这些都不符合我的具体情况。下面是我的SQL查询 目标是在$teamArr中为每个团队获取最新的媒体,以及一组唯一的ID 我面临的问题是,它不会为每一个团队获得最新的媒体,而是基于团队的顺序,即媒体独立于团队的时间 下面是MySQL命令和PHP的sprintf命令,以便于使用团队ID sprintf("SELECT M.*, T.name, T.has_image FROM media AS M JOIN teams A

你可能会问的第一个问题是,有多少分组/按顺序提问?很多这些都不符合我的具体情况。下面是我的SQL查询

目标是在$teamArr中为每个团队获取最新的媒体,以及一组唯一的ID

我面临的问题是,它不会为每一个团队获得最新的媒体,而是基于团队的顺序,即媒体独立于团队的时间

下面是MySQL命令和PHP的sprintf命令,以便于使用团队ID

sprintf("SELECT M.*, T.name, T.has_image
    FROM media AS M
        JOIN teams AS T
          ON T.team_uid = M.team_uid
    WHERE M.team_uid IN (%s)
    GROUP BY T.team_uid
    ORDER BY M.time DESC", implode(", ", $teamArr));
情景:

团队A有一个3小时前的媒体项目,团队B有两个6小时前和2天前的项目,团队C有一个9小时前的媒体项目

如果选择的顺序是团队A、C、B,那么媒体项将如下所示

TeamA 3小时前的媒体项目 TeamC 9小时前的媒体项目 TeamB 2天前的媒体项目 可能会有一些愚蠢的评论说

只需按队名订购即可!这么简单的问题。这个答案将获得大约+4票


但这显然对我毫无帮助。如果任何自然或非自然的顺序能够处理3个以上的案例,我不知道哪个团队会有最佳顺序。是否有一种方法可以在1SQL查询中实现这一点。我听说循环中的MySQL是一个糟糕的决定,因此我希望它能在1个SQL调用中工作。

这种查询通常被标记为最大n个组以供将来参考

您需要每个团队的最长时间和相应的列,对吗

解决这一问题的典型方法是将要获得最大值的表左键连接到案例介质中:

这些变化:

左键将媒体连接到每个团队中,通过变量对组进行uid,使M.time不,这在SQL中不是一项容易的任务。不过,这是一个常见的问题。通常足以拥有自己的标记:。通过单击右侧相关标题上方或下方的标记进行搜索。你可以将2天改为48小时,从而对所有时间使用相同的比较吗?这是unix时间戳@northpole。所以比较并不重要。。。这只是一个场景,你可以看到发生了什么……好吧,我没有其他建议,所以我对解决方案非常感兴趣……我会关注的。你不想按M.time下单,但你只想汇总每个小组成员的最新订单。请参阅并暂时删除order by子句。如果你还需要它,你可以稍后再添加。让我试试这个。我已经开始阅读了。我从来没有听说过最大的每组n个问题,但现在我至少可以开始搜索它了!据我所知,这是正确的工作。我非常感谢您的代码,但更感谢您的解释。如果我理解代码背后的推理,它会使编码方式变得更好!不用担心-这种查询在您第一次执行时会令人困惑,但是如果您尝试仅使用媒体表,请暂时忘记加入团队,并在不应用任何WHERE条件的情况下查看加入表,即从M左起选择..、M.time、M2.time加入M2开。。如果不是空的,它可以是很有教育意义的。
SELECT M.*, T.name, T.has_image
FROM media AS M
LEFT JOIN media AS M2              -- new: join media to itself
       ON M.team_uid = M2.team_uid -- within each team_uid (GROUP BY var)
      AND M.time < M2.time         -- and a sort on time (ORDER BY var)
JOIN teams AS T              -- same as before.
 ON T.team_uid = M.team_uid
WHERE M.team_uid IN (%s)     
  AND M2.time IS NULL        -- new: this selects the MAX M.time for each team.