【发布时间】:2012-02-21 23:29:40
【问题描述】:
您可能会问的第一个问题是 SO 上有多少 Group by / Order by 问题?很多。这些都不适合我的具体情况。这是我的以下 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 小时前的媒体项目。
如果选择的顺序是Team A、C、B,那么媒体项将如下...
- TeamA 3 小时前的媒体项目
- TeamC 9 小时前的媒体项目
- TeamB 2 天前的媒体项目
可能会有一些愚蠢的言论说
只需按团队名称订购即可!这么简单的问题。 (这个答案将获得大约 +4 票)
但这显然对我没有帮助。我不知道哪些团队将拥有最佳顺序(如果任何自然或非自然顺序甚至可以处理超过 3 个案例)。有没有一种方法可以让我在 1 个 SQL 查询中做到这一点。我听说循环中的 MySQL 是一个糟糕的决定,因此我希望它在 1 个 SQL 调用中工作。
【问题讨论】:
-
不,这在 SQL 中不是一件容易的事。虽然它通常被问到。通常足以拥有自己的标签:
[greatest-n-per-group]。通过单击右侧相关标题上方或下方的该标签进行搜索。 -
你能把 2 天变成 48 小时而不是几天,这样你就可以对所有人使用相同的比较了吗?
-
它是一个 unix 时间戳@northpole。所以比较无关紧要......它只是一个场景,所以你可以看到发生了什么......
-
好的,我没有其他建议,所以我对解决方案非常感兴趣......我会看的。
-
您不想通过
M.time订购,但您只想汇总每个组成员的最新信息。请参阅aggregate functions 并暂时删除 order by 子句。如果您仍然需要它,您可以稍后再次添加它。
标签: php mysql group-by sql-order-by greatest-n-per-group