[英]Get min value based on foreign key
I am stuck on how to get a student's minimum score from marks
table and student
info from student table. 我被困在如何从一个学生的最低分数marks
表和student
从学生表信息。
EDIT: sorry for not mentioning, but i need result for user 1, st1 编辑:很抱歉没有提及,但是我需要用户1,st1的结果
student 学生
id name
1 st1
2 st2
marks 分数
student_id course_name marks
1 C++ 55
1 OOP 65
1 AI 45 //need this lowest result for st1
2 C++ 82
2 STATS 74
2 OS 20 // lowest marks are these for st2 or overall
Edit forgot to enter name st1: 编辑忘记输入名称st1:
Desired Output: 所需输出:
id name course_name MinMarks
1 st1 AI 45
I tried this query but it gives wrong course_name
(C++) 1st row's course name 我尝试了此查询,但是给出了错误的course_name
(C ++)第一行的课程名称
SELECT s.id, s.name, m.course_name, MIN(m.marks) FROM student s
JOIN marks m
ON s.id = m.student_id
Where s.id = 1
Output: 输出:
id name course_name MinMarks
1 st1 C++ 45
You can use a subquery: 您可以使用子查询:
select *
from marks
where marks = (select min(marks) from marks)
or left join
: 或left join
:
select m.*
from marks m
left join (select min(marks) as marks from marks) m_min on m.marks = m_min.marks
where m_min.marks is not null
It guarantees you that if there is more then one student with the minimum mark
it displays all of them. 它向您保证,如果一个学生的mark
最低,它将显示所有学生。
left join
can possibly improve performance, you can check your execution plan to be sure. left join
可能会提高性能,您可以确定执行计划。
PS: If you also need to retrieve name
from student
table (is not stated in your desired output) you can do the join
operation you did in your query: PS:如果您还需要从student
表中检索name
(未在所需的输出中声明),则可以执行在查询中执行的join
操作:
using subquery: 使用子查询:
select m.student_id
, s.name
, m.course_name
, m.marks
from student s
join marks m on s.id = m.student_id
where m.marks = (select min(marks) from marks)
using left join
: 使用left join
:
select m.student_id
, s.name
, m.course_name
, m.marks
from student s
join marks m on s.id = m.student_id
left join (select min(marks) as marks from marks) m_min on m.marks = m_min.marks
where m_min.marks is not null
Edit 编辑
As it turns out, OP needs a minimum marks
per student
's id
(for the id = 1
), so : 事实证明, OP需要每个student
的id
最少marks
(对于id = 1
),因此:
select m.student_id
, s.name
, m.course_name
, m.marks
from student s
join marks m on s.id = m.student_id
left join (select student_id, min(marks) as marks from marks group by student_id) p on s.id = p.student_id and p.marks = m.marks
where s.id = 1 and p.student_id is not null
try this: 尝试这个:
Select s.id, s.name, m.course_name, m.marks From student s
right join marks m
on s.id = m.user_id where m.marks = MIN(m.marks);
Try something like 尝试类似
select
s.id,
s.name,
m.course_name,
m.marks
from
student s
inner join marks m on
m.student_id = is.id
inner join (
select
student_id,
min(marks) min_mark
from
marks m
group by
student_id
) min_marks on
min_marks.student_id = s.id and
min_marks.student_id = m.student_id and
min_marks.min_mark = m.marks
If you are looking for only one student with the minimum mark, I would suggest order by
and limit
: 如果您只寻找一个分数最低的学生,我建议order by
和limit
:
SELECT s.id, s.name, m.course_name, m.marks
FROM student s JOIN
marks m
ON s.id = m.user_id
ORDER BY m.marks ASC
LIMIT 1;
This solution will not work if you are looking for all students that have the same minimum mark. 如果您正在寻找所有具有相同最低分数的学生,则此解决方案将不起作用。
SELECT s.id, s.name, m.course_name, m.marks
FROM marks m
JOIN student s
ON m.student_id = s.id
WHERE m.student_id=1 AND m.marks = (SELECT MIN(marks) FROM marks WHERE student_id=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.