我有以下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
我在我的问题中简化了我的陈述(为了便于阅读),所以希望问题仍然有意义。
答案 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