Php 从数据库中提取多条记录时,Mysql子查询返回错误

Php 从数据库中提取多条记录时,Mysql子查询返回错误,php,mysql,Php,Mysql,我使用下面的代码生成学生在不同科目中的成绩列表,以根据他们的成绩显示所有学生 $qry = "select * from ( select (select percentage from exams_db where subjecttype = 'English') as English, (select percentage from exams_db where subjecttype = 'Biology') as Biology, (sel

我使用下面的代码生成学生在不同科目中的成绩列表,以根据他们的成绩显示所有学生

 $qry = "select * from (
 select (select percentage from exams_db where subjecttype = 'English') as English,
           (select percentage from exams_db where subjecttype = 'Biology') as Biology,
           (select percentage from exams_db where subjecttype = 'Maths') as Maths,
           (select percentage from exams_db where subjecttype = 'Science') as Science,
           (select percentage from exams_db where subjecttype = 'SocialStudies') as SocialStudies,
           (select total_marks from exams_db ORDER BY total_marks DESC LIMIT 1) as total_marks,
           (select exam_date from exams_db ORDER BY id DESC LIMIT 1) as exam_date

    from exams_db group by Maths
    union all
    select (select grade from exams_db where subjecttype = 'English') as English,
           (select grade from exams_db where subjecttype = 'Biology' ) as Biology,
           (select grade from exams_db where subjecttype = 'Maths') as Maths,
           (select grade from exams_db where subjecttype = 'Science') as Science,
           (select grade from exams_db where subjecttype = 'SocialStudies') as SocialStudies, 
           (select total_marks from exams_db  ORDER BY total_marks DESC LIMIT 1) as total_marks,
           (select exam_date from exams_db ORDER BY id DESC LIMIT 1) as exam_date

    from exams_db group by Maths
     ) t "; 
但是,我得到一个错误,子查询返回的行数超过1行

但是,当我按照下面的方式编辑代码时,它只适用于一个用户

$qry = "select * from (
 select (select percentage from exams_db  where subjecttype = 'English' AND user = '$userid') as English,
           (select percentage from exams_db  where subjecttype = 'Biology' AND user = '$userid') as Biology,
           (select percentage from exams_db  where subjecttype = 'Maths' AND user = '$userid') as Maths,
           (select percentage from exams_db  where subjecttype = 'Science' AND user = '$userid') as Science,
           (select percentage from exams_db  where subjecttype = 'SocialStudies' AND user = '$userid') as SocialStudies,
           (select total_marks from exams_db  WHERE user = '$userid' ORDER BY total_marks DESC LIMIT 1) as total_marks,
           (select exam_date from exams_db  WHERE user = '$userid' ORDER BY id DESC LIMIT 1) as exam_date

    from exams_db  group by Maths
    union all
    select (select grade from exams_db  where subjecttype = 'English' AND user = '$userid') as English,
           (select grade from exams_db  where subjecttype = 'Biology' AND user = '$userid') as Biology,
           (select grade from exams_db  where subjecttype = 'Maths' AND user = '$userid') as Maths,
           (select grade from exams_db  where subjecttype = 'Science' AND user = '$userid') as Science,
           (select grade from exams_db  where subjecttype = 'SocialStudies' AND user = '$userid') as SocialStudies, 
           (select total_marks from exams_db WHERE user = '$userid' ORDER BY total_marks DESC LIMIT 1) as total_marks,
           (select exam_date from exams_db  WHERE user = '$userid' ORDER BY id DESC LIMIT 1) as exam_date

    from exams_db  group by Maths
     ) t ";
但是,我想显示所有用户。因此,我如何编辑我的第一个代码,使我能够显示所有用户,因为第二个代码帮助我,它只允许我显示一个用户

$qry = "select * from (
 select (select percentage from exams_db  where subjecttype = 'English' AND user = '$userid') as English,
           (select percentage from exams_db  where subjecttype = 'Biology' AND user = '$userid') as Biology,
           (select percentage from exams_db  where subjecttype = 'Maths' AND user = '$userid') as Maths,
           (select percentage from exams_db  where subjecttype = 'Science' AND user = '$userid') as Science,
           (select percentage from exams_db  where subjecttype = 'SocialStudies' AND user = '$userid') as SocialStudies,
           (select total_marks from exams_db  WHERE user = '$userid' ORDER BY total_marks DESC LIMIT 1) as total_marks,
           (select exam_date from exams_db  WHERE user = '$userid' ORDER BY id DESC LIMIT 1) as exam_date

    from exams_db  group by Maths
    union all
    select (select grade from exams_db  where subjecttype = 'English' AND user = '$userid') as English,
           (select grade from exams_db  where subjecttype = 'Biology' AND user = '$userid') as Biology,
           (select grade from exams_db  where subjecttype = 'Maths' AND user = '$userid') as Maths,
           (select grade from exams_db  where subjecttype = 'Science' AND user = '$userid') as Science,
           (select grade from exams_db  where subjecttype = 'SocialStudies' AND user = '$userid') as SocialStudies, 
           (select total_marks from exams_db WHERE user = '$userid' ORDER BY total_marks DESC LIMIT 1) as total_marks,
           (select exam_date from exams_db  WHERE user = '$userid' ORDER BY id DESC LIMIT 1) as exam_date

    from exams_db  group by Maths
     ) t ";
我的数据库结构如下

user    subjecttype  percentage  grade

 109283  English       40%         B

 345245  Biology       80%         A

 832904  Science       50%         C

我不是100%确定你想在这里输出什么

但是,假设您想要一个包含所有用户及其百分比、所有用户及其所有分数的列表,以及该用户的上次考试日期和最高总分:-

SELECT exam_date.user, English.percentage, Biology.percentage, Maths.percentage, Science.percentage, SocialStudies.percentage, exam_date.ExamDate, total_marks.TotalMarks
FROM (select user, MAX(exam_date) AS ExamDate from exams_db  WHERE user = '$userid' GROUP BY user) as exam_date
LEFT OUTER JOIN (select user, percentage from exams_db  where subjecttype = 'English' GROUP BY user) as English ON exam_date.user = English.user
LEFT OUTER JOIN (select user, percentage from exams_db  where subjecttype = 'Biology' GROUP BY user) as Biology ON exam_date.user = Biology.user
LEFT OUTER JOIN (select user, percentage from exams_db  where subjecttype = 'Maths' GROUP BY user) as Maths ON exam_date.user = Maths.user
LEFT OUTER JOIN (select user, percentage from exams_db  where subjecttype = 'Science' GROUP BY user) as Science ON exam_date.user = Science.user
LEFT OUTER JOIN (select user, percentage from exams_db  where subjecttype = 'SocialStudies' GROUP BY user) as SocialStudies ON exam_date.user = SocialStudies.user
LEFT OUTER JOIN (select user, MAX(total_marks) AS TotalMarks from exams_db  WHERE user = '$userid' GROUP BY user) as total_marks ON exam_date.user = total_marks.user
UNION ALL
SELECT exam_date.user, English.percentage, Biology.percentage, Maths.percentage, Science.percentage, SocialStudies.percentage, exam_date.ExamDate, total_marks.TotalMarks
FROM (select user, MAX(exam_date) AS ExamDate from exams_db  WHERE user = '$userid' GROUP BY user) as exam_date
LEFT OUTER JOIN (select user, grade from exams_db  where subjecttype = 'English' GROUP BY user) as English ON exam_date.user = English.user
LEFT OUTER JOIN (select user, grade from exams_db  where subjecttype = 'Biology' GROUP BY user) as Biology ON exam_date.user = Biology.user
LEFT OUTER JOIN (select user, grade from exams_db  where subjecttype = 'Maths' GROUP BY user) as Maths ON exam_date.user = Maths.user
LEFT OUTER JOIN (select user, grade from exams_db  where subjecttype = 'Science' GROUP BY user) as Science ON exam_date.user = Science.user
LEFT OUTER JOIN (select user, grade from exams_db  where subjecttype = 'SocialStudies' GROUP BY user) as SocialStudies ON exam_date.user = SocialStudies.user
LEFT OUTER JOIN (select user, MAX(total_marks) AS TotalMarks from exams_db  WHERE user = '$userid' GROUP BY user) as total_marks ON exam_date.user = total_marks.user
如果这不是您想要的,请不要用代码解释它。你们有学生桌吗

编辑-对于用户列表(已完成考试的用户),我认为以下内容可以做到:-

SELECT exam_date.user, 
    English.percentage, 
    Biology.percentage, 
    Maths.percentage, 
    Science.percentage, 
    SocialStudies.percentage, 
    English.grade, 
    Biology.grade, 
    Maths.grade, 
    Science.grade, 
    SocialStudies.grade, 
    exam_date.ExamDate, 
    total_marks.TotalMarks
FROM (SELECT user, MAX(exam_date) AS ExamDate FROM exams_db GROUP BY user) as exam_date
LEFT OUTER JOIN (SELECT user, percentage, grade FROM exams_db where subjecttype = 'English' GROUP BY user) as English ON exam_date.user = English.user
LEFT OUTER JOIN (SELECT user, percentage, grade FROM exams_db where subjecttype = 'Biology' GROUP BY user) as Biology ON exam_date.user = Biology.user
LEFT OUTER JOIN (SELECT user, percentage, grade FROM exams_db where subjecttype = 'Maths' GROUP BY user) as Maths ON exam_date.user = Maths.user
LEFT OUTER JOIN (SELECT user, percentage, grade FROM exams_db where subjecttype = 'Science' GROUP BY user) as Science ON exam_date.user = Science.user
LEFT OUTER JOIN (SELECT user, percentage, grade FROM exams_db where subjecttype = 'SocialStudies' GROUP BY user) as SocialStudies ON exam_date.user = SocialStudies.user
LEFT OUTER JOIN (SELECT user, MAX(total_marks) AS TotalMarks FROM exams_db GROUP BY user) as total_marks ON exam_date.user = total_marks.user
注意,我对total_marks字段有点怀疑(您最初的查询只是得到了最高的总分)

可能更有效(但完全未经测试)的方法是:-

SELECT users.user, 
    exam_dates.ExamDate, 
    total_marks.TotalMarks, 
    MAX(IF(Sub1.subjecttype='English', exams_db.percentage, 0)) AS EnglishPercentage,
    MAX(IF(Sub1.subjecttype='English', exams_db.grade, 0)) AS EnglishGrade,
    MAX(IF(Sub1.subjecttype='Biology', exams_db.percentage, 0)) AS BiologyPercentage,
    MAX(IF(Sub1.subjecttype='Biology', exams_db.grade, 0)) AS BiologyGrade,
    MAX(IF(Sub1.subjecttype='Maths', exams_db.percentage, 0)) AS MathsPercentage,
    MAX(IF(Sub1.subjecttype='Maths', exams_db.grade, 0)) AS MathsGrade,
    MAX(IF(Sub1.subjecttype='Science', exams_db.percentage, 0)) AS SciencePercentage,
    MAX(IF(Sub1.subjecttype='Science', exams_db.grade, 0)) AS ScienceGrade,
    MAX(IF(Sub1.subjecttype='SocialStudies', exams_db.percentage, 0)) AS SocialStudiesPercentage,
    MAX(IF(Sub1.subjecttype='SocialStudies', exams_db.grade, 0)) AS SocialStudiesGrade
FROM users
LEFT OUTER JOIN (
    SELECT user, subjecttype, MAX(exam_date) AS LatestSubjectExam 
    FROM exams_db 
    WHERE subjecttype IN ('English', 'Biology', 'Maths', 'Science', 'SocialStudies') 
    GROUP BY user, subjecttype
) Sub1 ON users.user = Sub1.user
LEFT OUTER JOIN exams_db ON Sub1.user = exams_db.user AND Sub1.subjecttype = exams_db.subjecttype AND Sub1.LatestSubjectExam = exams_db.exam_date
LEFT OUTER JOIN (SELECT user, MAX(total_marks) AS TotalMarks FROM exams_db GROUP BY user) total_marks ON users.user = total_marks.user
LEFT OUTER JOIN (SELECT user, MAX(exam_date) AS ExamDate FROM exams_db GROUP BY user) exam_dates ON users.user = exam_dates.user
GROUP BY users.user, exam_dates.ExamDate, total_marks.TotalMarks
重新编辑

在第二种查询中尝试处理重复的用户/考试

SELECT exam_date.user, 
    English.percentage, 
    Biology.percentage, 
    Maths.percentage, 
    Science.percentage, 
    SocialStudies.percentage, 
    English.grade, 
    Biology.grade, 
    Maths.grade, 
    Science.grade, 
    SocialStudies.grade, 
    exam_date.ExamDate, 
    total_marks.TotalMarks
FROM (SELECT user, MAX(exam_date) AS ExamDate FROM exams_db GROUP BY user) as exam_date
LEFT OUTER JOIN (
    SELECT user, subjecttype, MAX(exam_date) AS LatestSubjectExam 
    FROM exams_db 
    WHERE subjecttype IN ('English', 'Biology', 'Maths', 'Science', 'SocialStudies') 
    GROUP BY user, subjecttype
) Sub1 ON exam_date.user = Sub1.user
LEFT OUTER JOIN (SELECT user, exam_date, percentage, grade FROM exams_db where subjecttype = 'English' GROUP BY user, exam_date) as English ON exam_date.user = English.user AND Sub1.subjecttype = 'English' AND Sub1.LatestSubjectExam = English.exam_date
LEFT OUTER JOIN (SELECT user, exam_date, percentage, grade FROM exams_db where subjecttype = 'Biology' GROUP BY user, exam_date) as Biology ON exam_date.user = Biology.user AND Sub1.subjecttype = 'Biology' AND Sub1.LatestSubjectExam = Biology.exam_date
LEFT OUTER JOIN (SELECT user, exam_date, percentage, grade FROM exams_db where subjecttype = 'Maths' GROUP BY user, exam_date) as Maths ON exam_date.user = Maths.user AND Sub1.subjecttype = 'Maths' AND Sub1.LatestSubjectExam = Maths.exam_date
LEFT OUTER JOIN (SELECT user, exam_date, percentage, grade FROM exams_db where subjecttype = 'Science' GROUP BY user, exam_date) as Science ON exam_date.user = Science.user AND Sub1.subjecttype = 'Science' AND Sub1.LatestSubjectExam = Science.exam_date
LEFT OUTER JOIN (SELECT user, exam_date, percentage, grade FROM exams_db where subjecttype = 'SocialStudies' GROUP BY user, exam_date) as SocialStudies ON exam_date.user = SocialStudies.user AND Sub1.subjecttype = 'SocialStudies' AND Sub1.LatestSubjectExam = SocialStudies.exam_date
LEFT OUTER JOIN (SELECT user, MAX(total_marks) AS TotalMarks FROM exams_db GROUP BY user) as total_marks ON exam_date.user = total_marks.user

您可以一次又一次地连接表本身,但我认为这非常无用,因为您在PHP中使用它。您不关心数据库如何提取结果。您可以选择百分比、主观评分、总分、考试日期、考试数据库中的用户,这样您就可以在每一行上显示主观评分的百分比、总分和日期。对于用户,我不是专家,但据我所知,子查询生成一个虚拟表,每行应该包含一个条目。看起来您正在子查询中返回多行(子查询。我仍在关注这一点,但我希望这能有所帮助。@RoyalBg无法以这种方式获取,因为我以不同的方式设计了我的表。请参阅“我的表是什么样子”问题中的编辑。ThanksAm试图输出用户的详细信息,如他们的姓名以及他们在每个主题和主题中的得分他们得到了总分。在这种情况下,我怀疑工会不是你想要的(这将在不同的行上增加分数和百分比)是的,这实际上是一个问题,另一个问题是,当数据库中每个科目只有一个记录时,它就起作用了。但是当我有两个“生物”时,查询失败了。你可以在这里联系到这把小提琴。我给出的最后一个例子应该处理一个人在一次考试中的多次考试尝试。将尝试并获得第二个查询的处理方式与第二个查询给出空查询结果的方式相同。