您可能会问的第一个问题是,有多少组按/按问题排序?很多。都不适合我的具体情况。下面是我的以下SQL查询。
目标是获取$teamArr中每个团队的最新媒体(一组唯一的ids)。
我面临的问题是,它将不会得到最新的媒体为每一个,但它的基础是小组的顺序,这是媒体独立于团队的时间。
下面是MySQL命令(为了便于团队Ids使用,使用sprintf()命令)。
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天前有2项,C组有9小时前的媒体项目。
如果选择的顺序是A,C,B组,那么媒体项目如下.
可能会有一些愚蠢的说法
只是按团队名称订购!这么简单的问题。(这个答案将获得+4票)
但这显然对我毫无帮助。我不知道哪个团队会有最优的排序(如果任何自然的或非自然的排序甚至工作超过3种情况)。是否有一种方法可以在1 SQL查询中完成。我听说循环中的MySQL是一个糟糕的决定,因此我想让它在1 SQL调用中工作。
发布于 2012-02-21 23:39:11
这类查询通常被标记为“每个组中最大的n个”,以供将来参考。
你想要每个团队的最长时间和相应的列,对吗?
解决这一问题的典型方法是将您想要获得的表最大到LEFT JOIN本身(在您的例子中是media):
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.这些变化:
LEFT JOIN media本身在每个team_uid ( GROUP BY变量)中,并使M.time < M2.time (我们希望最大的变量)。LEFT JOIN,如果存在一个没有更大的M2.time的M.time (对于同一个团队),那么M2.time将为NULL。这正是当above)WHERE条件中添加M2.time IS NULL (以强制执行WHERE GROUP BY,ORDER BY (在join条件中处理)。https://stackoverflow.com/questions/9386961
复制相似问题