如何使用union解决mySQL下的这个完全外连接问题

时间:2011-07-28 18:01:48

标签: mysql sql

这是表格

 stuid stuname subject grade
 1     alex    algo    99
 1     alex    dastr   100
 2     bob     algo    90
 2     bob     dastr   95
 3     casy    algo    100
 4     Daisy   dastr   100

case1:假设表中只有两个主题 以下是预期产出

 stuname algo dastr 
 alex    99    100
 bob     90    95
 casy    100   0
 Daisy   0     100

我认为以下是一个可行的查询

select g1.stuname,
       COALESCE(g1.grade,0) as algo
       COALESCE(g2.grade,0) as dastr
from grades g1 
full outer join grades g2 on g1.stuid = g2.stuid
where g1.subject = algo and g2.subject = dastr;

但是,mysql不支持完全外连接。有没有其他方法可以解决这个问题?

另外,案例2 假设表中有未知数量的主题 并且预期的输出将是

stuname subj1 subj2 subj3 ... subjn

我知道我可能正在使用过程来解决它,有没有其他方法可以用来组成mySQL中的列?

3 个答案:

答案 0 :(得分:2)

如果您重新构建表格,您的查询会更好。您试图在一个表中存储太多信息。这是一个建议的结构:

Students
student_id student_name
1          Alex
2          Bob
3          Casy
4          Daisy

Subjects
subject_id subject_name
1          Algo
2          Dastr

Grades
student_id subject_id grade
1          1          99
1          2          100
2          1          90
2          2          95
3          1          100
4          2          100

在成绩中,student_id和subject_id将是一个复合键,这意味着两者的唯一组合将成为唯一标识符(学生1,主题1与学生1,主题2不同)

要根据您的评论返回数据,请尝试:

  SELECT a.student_name, b.subject_name, c.grade
    FROM students a, subjects b, grades c
   WHERE a.student_id = c.student_id
     AND b.subject_id = c.subject_id
ORDER BY a.student_id

答案 1 :(得分:0)

您是否尝试过以下方面的内容:

SELECT a.stuid as sidA, a.grade as grA, a.grade as grB
FROM grades a JOIN grades b ON (a.stuname = b.stuname)

但正如D.N.建议的那样,重组你的表可能是值得的

答案 2 :(得分:0)

从您现有的数据......

select 
      stuid,
      max( stuName ) stuName, 
      max( if( subject = "algo", grade, 000 )) as Algo,
      max( if( subject = "dastr", grade, 000 )) as Dastr
   from 
      Grades
   group by
      stuid
   order by
      stuName

但是,如果您有多个具有相同“StuName”的人,则通过按其唯一ID进行分组,这将使他们保持差异化,因此为了澄清,我在最终查询中包含了ID列。

然而,@ D.N建议的数据重组。会更清洁。