我有一个问题:
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
一切都还可以, 除了 我得到奖牌升序而不是下降 这意味着它获得了用户获得的第一枚奖牌 - 我需要获得最后一枚 。
答案 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