Mysql 左键联接SQL表并获取最近一行的值
我有一个SQL语句,我已经处理了一段时间了 如何从另一个表中获取最新的“按日期”,然后获取id权重值。这是我目前的疑问: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
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