使用MAX函数时从表中获取字段

时间:2015-11-03 12:03:34

标签: mysql group-by max

我有以下MySQL语句,它运行良好。

SELECT c.id, IFNULL(MAX(l.id), 0) as level_id
FROM course c
LEFT JOIN level l ON c.level_id = l.id
WHERE c.user_id = '123'    
GROUP BY c.id

课程可以有多个级别,因此IFNULL(MAX(l.id), 0)可以选择最高级别。

然而,我想获得这个名字,而不是返回最高级别的id。我尝试了以下内容,但MySQL并不喜欢使用select中的值加入。

SELECT c.id, IFNULL(MAX(l.id), 0) as level_id, l2.name
FROM course c
LEFT JOIN level l ON c.level_id = l.id 
INNER JOIN level l2 ON level_id = l2.id
WHERE c.user_id = '123'     
GROUP BY c.id

我在我的问题中简化了我的陈述(为了便于阅读),所以希望问题仍然有意义。

2 个答案:

答案 0 :(得分:1)

使用这种类型的查询,我认为最简单的方法是substring_index() / group_concat()诀窍:

SELECT c.id, COALESCE(MAX(l.id), 0) as level_id,
       SUBSTRING_INDEX(GROUP_CONCAT(l2.name ORDER BY l.id DESC), ',', 1) as name
FROM course c LEFT JOIN
     level l
     ON c.level_id = l.id INNER JOIN
     level l2
     ON level_id = l2.id
WHERE c.user_id = '123'
GROUP BY c.id;

请注意,WHERE在您的查询中放错了位置。

关于这种方法的注意事项:

  • 如果name可能包含逗号,则需要使用其他分隔符。
  • group_concat()中间结果的长度存在内部限制。如果这是一个问题,可以增加长度。

答案 1 :(得分:1)

另一种方法是执行子查询并将结果反馈到级别表以获取级别名称: -

SELECT sub0.id, sub0.level_id, l2.name
FROM
(
    SELECT c.id, IFNULL(MAX(l.id), 0) as level_id
    FROM course c
    LEFT JOIN level l ON c.level_id = l.id 
    WHERE c.user_id = '123'
    GROUP BY c.id
)
LEFT OUTER JOIN level l2 ON l2.id = sub0.level_id