首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL,GroupBy OrderBy

问MySQL,GroupBy OrderBy
EN

Stack Overflow用户
提问于 2012-02-21 23:29:40
回答 1查看 200关注 0票数 4

您可能会问的第一个问题是,有多少组按/按问题排序?很多。都不适合我的具体情况。下面是我的以下SQL查询。

目标是获取$teamArr中每个团队的最新媒体(一组唯一的ids)。

我面临的问题是,它将不会得到最新的媒体为每一个,但它的基础是小组的顺序,这是媒体独立于团队的时间。

下面是MySQL命令(为了便于团队Ids使用,使用sprintf()命令)。

代码语言:javascript
复制
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组,那么媒体项目如下.

  • TeamA 3小时前的媒体项目
  • TeamC的9小时前的媒体项目
  • TeamB的2天前的媒体项目

可能会有一些愚蠢的说法

只是按团队名称订购!这么简单的问题。(这个答案将获得+4票)

但这显然对我毫无帮助。我不知道哪个团队会有最优的排序(如果任何自然的或非自然的排序甚至工作超过3种情况)。是否有一种方法可以在1 SQL查询中完成。我听说循环中的MySQL是一个糟糕的决定,因此我想让它在1 SQL调用中工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-21 23:39:11

这类查询通常被标记为“每个组中最大的n个”,以供将来参考。

你想要每个团队的最长时间和相应的列,对吗?

解决这一问题的典型方法是将您想要获得的表最大到LEFT JOIN本身(在您的例子中是media):

代码语言:javascript
复制
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)
  • remove M.time是该团队的最大时间时。
  • 在WHERE条件中添加M2.time IS NULL (以强制执行WHERE GROUP BY,ORDER BY (在join条件中处理)。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9386961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档