mysql左连接升序

时间:2010-09-07 03:40:11

标签: sql mysql greatest-n-per-group

我有一个问题:

   SELECT reply.id,
          reply.message,
          reply.userid,
          reply.date,
          medal.id,
          medal.url,
          medal.name,
          user.id,
          user.name AS username
     FROM posts AS reply
LEFT JOIN users AS user ON reply.userid = user.id
LEFT JOIN medals AS medal ON medal.userid = user.id
 GROUP BY reply.id
 ORDER BY reply.id ASC

一切都还可以, 除了 我得到奖牌升序而不是下降 这意味着它获得了用户获得的第一枚奖牌 - 我需要获得最后一枚

3 个答案:

答案 0 :(得分:1)

您看到每组的第一条记录是偶然的。在GROUP BY查询中选择非聚合,非组唯一列会导致选择未定义的记录。

有关更详细的说明,请阅读:http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html

执行您正在执行的操作的一种正确方法是使用子查询,在该子查询中,您可以选择每个所需组的最大奖牌日期。

此处概述了此方法:http://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html

答案 1 :(得分:0)

您可以为奖牌制作子查询或临时表,而不是直接加入奖牌。临时表将是奖牌表,但已排序DESC。子查询将是LEFT JOIN(选择id,url,来自desc的奖牌顺序的名称),但我觉得这将是非常缓慢的,而不是最好的选择。

答案 2 :(得分:0)

最简单的解决方案是:

ORDER BY reply.id ASC, medal.id DESC

AND 删除您的GROUP BY声明。

您可以过滤之后有多枚奖牌的帖子/用户(跳过包含您不想要的奖牌的行)。

下一个选项是在子查询中选择MAX(medal.id),然后加入该子查询。这变得混乱,但是可行。这是一般性的想法(您可能需要重命名一些表别名,因为它们被多次使用):

SELECT *,
       medal.url,
       medal.name
FROM
(
   SELECT reply.id,
          reply.message,
          reply.userid,
          reply.date,
          MAX(medal.id) AS medal_id,
          user.id,
          user.name AS username
     FROM posts AS reply
LEFT JOIN users AS user ON reply.userid = user.id
LEFT JOIN medals AS medal ON medal.userid = user.id
 GROUP BY reply.id
 ORDER BY reply.id ASC
)
AS t
LEFT JOIN medals AS medal ON medal.id = t.medal_id