简体   繁体   English

根据外键获取最小值

[英]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需要每个studentid最少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 bylimit

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM