这是表格
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中的列?
答案 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建议的数据重组。会更清洁。