按日期抓取最新的行,但按另一个表中的列分组

时间:2015-03-23 13:47:11

标签: mysql

编辑:这是数据库的SQL小提琴:http://www.sqlfiddle.com/#!9/bf137/1

我已经对这个问题进行了长时间的搜索,我发现了类似的问题,这些问题在我的路上帮助了我,但是我不能靠自己的力量来实现这一目标。如果这是重复的话,请道歉!

我想要做的就是获取一个身体部位列表以及你锻炼的最后一天。所以基于workout.exercise和exercise.name加入两个表,按exercises.date排序,然后按exercise.area分组。

我只想按区域分组,并返回每个的最新(按日期字段)行。所以最近的胸部,肩部,腿部,背部锻炼都进行了。

我已经掌握了基础知识,但日期排序拒绝工作:

SELECT * FROM (
    SELECT DISTINCT *
    FROM workouts
    WHERE user = 1
    ORDER BY date DESC
) as workouts
JOIN (
    SELECT name, area
    FROM exercises
) exercises
ON workouts.exercise = exercises.name
GROUP BY area

如果您运行SQLFiddle,您将看到四个Back练习中的最后一个,组中不会返回最新的练习。理想情况下,我应该得到这个结果(删除了cols以便于阅读):

id  date                  exercise      name            area
5   2015-03-18 13:30:00   Bench press   Bench press     Chest
1   2015-03-04 15:04:00   Front raises  Front raises    Shoulders
3   2015-03-16 21:08:00   Squats        Squats          Legs
8   2015-03-23 12:03:00   Lat pulldowns Lat pulldowns   Back

2 个答案:

答案 0 :(得分:2)

SELECT w.*
     , e.*
  FROM workouts w
  JOIN exercises e
    ON e.name = w.exercise
  JOIN 
     ( SELECT e.area
            , MAX(w.date) max_date 
         FROM exercises e 
         JOIN workouts w 
           ON w.exercise = e.name
        GROUP 
           BY e.area
     ) y
    ON y.area = e.area
   AND y.max_date = w.date;

(这可能不完全正确)

答案 1 :(得分:0)

您可以使用MAX列上的date功能:

SELECT MAX(w.date) date
, w.routine, w.exercise, e.area
FROM workouts w
INNER JOIN exercises e ON w.exercise = e.name
GROUP BY e.area;