Mysql 左键联接SQL表并获取最近一行的值

Mysql 左键联接SQL表并获取最近一行的值,mysql,sql,Mysql,Sql,我有一个SQL语句,我已经处理了一段时间了 如何从另一个表中获取最新的“按日期”,然后获取id权重值。这是我目前的疑问: SELECT e.name, e.picture_url, e.id AS exercise_id, w.parent_id, e.video_url, w.id, w.comment, w.time, w.reps, w.rest, w.sets, wt.name as wtype, w.order_by, mg.name as muscle

我有一个SQL语句,我已经处理了一段时间了

如何从另一个表中获取最新的“按日期”,然后获取id权重值。这是我目前的疑问:

SELECT e.name, e.picture_url, e.id AS exercise_id, w.parent_id, e.video_url,
        w.id, w.comment, w.time, w.reps, w.rest, w.sets, wt.name as wtype,
        w.order_by, mg.name as muscle_group, eq.name as equipment, w_track.*
        FROM workout w
        LEFT JOIN exercises e
        ON e.id = w.exercise_id
        LEFT JOIN workout_types wt
        ON wt.id = e.workout_type_id
        LEFT JOIN muscle_groups mg
        ON e.muscle_group_id = mg.id
        LEFT JOIN equipments eq
        ON eq.id = e.equipment_id

        LEFT JOIN (SELECT workout_id, weight FROM workout_tracking GROUP BY workout_id ORDER BY date DESC, id DESC) w_track
        ON w.id = w_track.workout_id


        WHERE workout_day_id = 395
我想左键加入训练跟踪,并获取最新的“重量”值-具有最新日期和最高id的行

提前谢谢! 感谢大家的帮助

更新 当我运行上面的查询时,我会得到一些随机的“权重”数字,而不是最近的一个

“训练”表包括: -id用于训练跟踪的主键 -“训练日”的训练日id外键 -代表 -休息 -设置 -等等

“训练跟踪”表包括: -身份证 -训练\u id训练表外键 -重量 -日期

样本数据 “训练”-表格:

  +---+------------+-------------+
  |id |     sets   |    reps     |
  +---+------------+-------------+
  | 1 |      3     |     10
“训练跟踪”-表格:

  +---+------------+-------------+-------------+
  |id | workout_id |    weight   |    date
  +---+------------+-------------+-------------+
  | 1 |      1     |     10        2017-05-22
    2        1           12        2017-05-28
    3        1           14        2017-05-28
    4        1           11        2017-05-28
    5        1          NULL       2017-05-28
    6        1          NULL       2017-05-28

左键连接选择最大训练id作为训练id,按训练id顺序按日期描述从训练跟踪组中选择体重,id描述w上的w轨道。id=w轨道。训练id

简单的方法是使用变量:

因为您首先订购的是训练id,所以您可以找到最新日期和最新id,在这种情况下,它们将具有@rn=1

现在,您的最终查询应该是

SELECT w.*, filter.*
FROM workout w
JOIN (SELECT `id`, `workout_id`, `weight`, `date`,
              @rn := IF( @workout_id = `workout_id`,
                         @rn + 1,
                         IF(@workout_id := `workout_id`, 1, 1)
                       ) as rn
      FROM workout_tracking     
      CROSS JOIN (SELECT @rn := 0, @workout_id := -1) as var
      ORDER BY `workout_id`, `date` DESC, `id` DESC
     ) as filter
 ON w.id = filter.`workout_id`
WHERE filter.rn = 1;
对于左连接,请尝试:


不需要where条件。

显示数据库模式、示例数据和预期输出。请阅读,这里是一个学习如何提高问题质量和获得更好答案的好地方。我想你的问题在于选择训练id,按训练id列出的训练\u跟踪组的体重???@JuanCarlosOropeza Yes确切地说,训练id和训练\u跟踪表中的id之间有什么区别?…有了这些信息,我可以帮助您根据右侧字段将max添加到查询中。id是训练\u跟踪行的id,而训练\u id是表workoutHi zarif的外键,我尝试了你的查询,但它仍然给了我一些随机权重,这不是最近的。谢谢你的回答,但是sequel pro无法运行此查询-它说你的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在“@rn+1”附近使用的正确语法,IF@workout_id:=训练id,1,1'在第5行我漏掉了一个逗号,再试试看现场演示示例。哇,干得好,还有一件事-现在它不包括没有任何与之相关的训练跟踪行的练习。我试着在你的查询中做左键连接而不是常规连接。当我做左键连接时,它仍然不包括没有训练跟踪行的练习。
SELECT w.*, filter.*
FROM workout w
JOIN (SELECT `id`, `workout_id`, `weight`, `date`,
              @rn := IF( @workout_id = `workout_id`,
                         @rn + 1,
                         IF(@workout_id := `workout_id`, 1, 1)
                       ) as rn
      FROM workout_tracking     
      CROSS JOIN (SELECT @rn := 0, @workout_id := -1) as var
      ORDER BY `workout_id`, `date` DESC, `id` DESC
     ) as filter
 ON w.id = filter.`workout_id`
WHERE filter.rn = 1;
LEFT JOIN ( ... ) as filter
  ON w.id = filter.`workout_id`
 AND filter.rn = 1