Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询以打印属于对称对的学生的姓名_Mysql - Fatal编程技术网

Mysql SQL查询以打印属于对称对的学生的姓名

Mysql SQL查询以打印属于对称对的学生的姓名,mysql,Mysql,给出了学生、数学、科学的分数 学生 学生id主键| smallint 学生姓名| varchar30 数学成绩 学生id主键| smallint 分数|浮动5,2 科学分数 学生id主键| smallint 分数|浮动5,2 如果一名学生在科学上获得的分数与另一名学生在数学上获得的分数相等,并且在数学上获得的分数与另一名学生在科学上获得的分数相同,则称该学生为对称对的一部分 我试图通过以下查询解决上述问题: 选择s.student\u名称 来自学生 左连接数学\u标记m交叉连接科学\u标记sc

给出了学生、数学、科学的分数

学生

学生id主键| smallint 学生姓名| varchar30 数学成绩

学生id主键| smallint 分数|浮动5,2 科学分数

学生id主键| smallint 分数|浮动5,2 如果一名学生在科学上获得的分数与另一名学生在数学上获得的分数相等,并且在数学上获得的分数与另一名学生在科学上获得的分数相同,则称该学生为对称对的一部分

我试图通过以下查询解决上述问题:

选择s.student\u名称 来自学生 左连接数学\u标记m交叉连接科学\u标记sc 在s.student\u id=m.student\u id和m.student\u id=sc.student\u id上 存在的地方从数学中选择*m 其中sc.score=m.score m.score=sc.score 按学生姓名排序;
我没有得到正确的输出。有人能帮我找出哪里出了问题吗?

我会这样做:

SELECT s.student_name
FROM student s
LEFT JOIN mathematics_marks m ON m.student_id = s.student_id
LEFT JOIN science_marks sc ON sc.student_id = s.student_id
WHERE m.score IN (SELECT score FROM science_marks) OR sc.score IN (SELECT score FROM mathematics_marks)

交叉加入所有学生,然后将每个学生的分数与其他学生进行比较

select student1.student_name, student2.student_name
from (
         select s1.student_id, s1.student_name, m1.score "m_score", sc1.score "sc_score"
         from student s1
                  join mathematics_marks m1 on s1.student_id = m1.student_id
                  join science_marks sc1 on s1.student_id = sc1.student_id) student1,
     (
         select s2.student_id, s2.student_name, m2.score "m_score", sc2.score "sc_score"
         from student s2
                  join mathematics_marks m2 on s2.student_id = m2.student_id
                  join science_marks sc2 on s2.student_id = sc2.student_id) student2

where student1.student_id<>student2.student_id
  and student1.m_score = student2.sc_score
  and student1.sc_score = student2.m_score;

对于此要求,您需要对2个标记表进行多个联接,最后要获得学生的姓名,您需要联接学生表两次:

select st1.student_name, st2.student_name
from mathematics_marks m1
inner join science_marks s1 on s1.student_id > m1.student_id and s1.score = m1.score
inner join mathematics_marks m2 on m2.student_id = s1.student_id 
inner join science_marks s2 on s2.student_id < m2.student_id and s2.score = m2.score
inner join student st1 on st1.student_id = m1.student_id
inner join student st2 on st2.student_id = m2.student_id;

为了简单起见,请参阅。

,并在单个表下获得所有分数。让我们创建一个视图

create view student_marks as select mm.student_id,mm.score as m_score, sm.score as s_score  
        from mathematics_marks mm
        inner join science_marks sm on mm.student_id=sm.student_id;
现在我们在一张桌子下面有了所有的标记。 所以我们需要对上述观点进行自连接,找到满足对称条件的学生

select distinct s.* 
from student_marks sm1
inner join student_marks sm2 on sm1.m_score=sm2.s_score and sm2.m_score=sm1.s_score
left join student s on s.student_id = sm1.student_id or s.student_id=sm2.student_id;
如果不想创建视图,只需用视图查询替换学生标记即可。

select s.student_name 'student_name'
from student s
inner join mathematics_marks m
on m.student_id = s.student_id
inner join science_marks sc 
on sc.student_id = s.student_id
where m.score in ( select score from science_marks ) and 
      sc.score in ( select score from mathematics_marks )
ORDER BY student_name;

一个有用的练习是执行EXPLAIN EXTENDED[您的查询],然后显示警告,然后将原始查询与SQL引擎解析的查询进行比较。解释您的想法。当学生的数学和科学成绩相同时会发生什么?学生是否与自己形成对称对?似乎这里的查询模式基本上会返回每个学生的数学成绩,与任何科学成绩相匹配,与任何数学成绩相匹配的科学成绩,而不考虑这些匹配的成绩是否来自同一个学生,形成一对。为每个科目单独设置一个表似乎设计得很糟糕-不要将join操作的老式逗号语法与较新的join关键字语法混合使用。请指定所需的语法?