2016-03-02 52 views
-1

我想作为结果使用max()的最后一个项目,但我刚开始就算IM使用max() enter image description here何使用最多获得MySQL中最后一项()

这里的第一个项目是在SQL代码:

SELECT r.correct, r.items, r.percentage,MAX(r.date_taken) as date_taken, 
     u.username,u.FN, u.user_course_type, 
     IFNULL(u.user_major_type,'N/A') as user_major_type,u.level_name, 
     u.section_name 
FROM bcc_fs_exam_result r 
INNER JOIN 
(SELECT u.id_user, u.username, CONCAT(u.lastname,', ',u.firstname) as FN, 
c.user_course_type, m.user_major_type, l.level_name, s.section_name 
FROM bcc_fs_user u 
LEFT JOIN bcc_fs_user_course c on c.id_user_course = u.id_user_course 
LEFT JOIN bcc_fs_user_major m on m.id_user_major = u.id_user_major 
LEFT JOIN bcc_fs_group_level l ON l.id_level = u.id_level 
LEFT JOIN bcc_fs_group_section s ON s.id_section = u.id_section 
) u ON r.id_user = u.id_user WHERE r.id_exam = 5 GROUP BY r.id_user 

TIA

+0

日期改变,但(正确的,项目和百分比)根本没有改变我所缺的是什么 –

+0

基本上它是相连的,毕竟他们在同一张表中,所以它应该与其他字段一致,只要我使用日期字段(正确,项目和百分比)保持不变 –

回答

0

我从你的问题是,你想要得到“正确的”,“项”,“百分比”等。 bcc_fs_exam_result中具有最后一个或第一个日期的行的列。

如果这是正确的,那么您可以通过首先找到每个id_user的最小或最大日期,然后将其加入考试结果表中,过滤bcc_fs_exam_result

SELECT 
    r.correct, 
    r.items, 
    r.percentage, 
    r.date_taken, 
    u.username, 
    u.FN, 
    u.user_course_type, 
    IFNULL(u.user_major_type,'N/A') as user_major_type, 
    u.level_name, 
    u.section_name 
FROM bcc_fs_exam_result r 
INNER JOIN (

    SELECT u.id_user, 
     u.username, 
     CONCAT(u.lastname,', ',u.firstname) as FN, 
     c.user_course_type, 
     m.user_major_type, 
     l.level_name, 
     s.section_name 
    FROM bcc_fs_user u 
     LEFT JOIN bcc_fs_user_course c on c.id_user_course = u.id_user_course 
     LEFT JOIN bcc_fs_user_major m on m.id_user_major = u.id_user_major 
     LEFT JOIN bcc_fs_group_level l ON l.id_level = u.id_level 
     LEFT JOIN bcc_fs_group_section s ON s.id_section = u.id_section 

) u ON r.id_user = u.id_user 

INNER JOIN ( 
    SELECT 
     id_user, max(r.date_taken) as last_date_taken 
    FROM bcc_fs_exam_result 
    GROUP BY id_user 
) as lastdate ON lastDate.id_user = r.id_user and r.date_taken = lastdate.last_date_taken 

这可以更简单地写为:

SELECT 
    r.correct, 
    r.items, 
    r.percentage, 
    r.date_taken, 
    u.username, 
    CONCAT(u.lastname,', ',u.firstname) as FN, 
    c.user_course_type, 
    IFNULL(m.user_major_type,'N/A') as user_major_type, 
    l.level_name, 
    s.section_name 
FROM bcc_fs_exam_result r 
INNER JOIN ( 
    SELECT 
     id_user, max(r.date_taken) as last_date_taken 
    FROM bcc_fs_exam_result 
    GROUP BY id_user 
) as lastdate ON lastDate.id_user = r.id_user and r.date_taken = lastdate.last_date_taken 

INNER JOIN bcc_fs_user u on r.id_user = u.id_user 
LEFT JOIN bcc_fs_user_course c on c.id_user_course = u.id_user_course 
LEFT JOIN bcc_fs_user_major m on m.id_user_major = u.id_user_major 
LEFT JOIN bcc_fs_group_level l ON l.id_level = u.id_level 
LEFT JOIN bcc_fs_group_section s ON s.id_section = u.id_section 

你认为id_user + date_takenbcc_fs_exam_result代理键,你或许应该有约束,如果在所有可能强制执行。否则,从您的样本数据看,唯一ID列id_result的顺序跟在date_taken之后,所以您可能最好使用Max(id_result)而不是Max(date_taken)。这将避免返回重复的行为一个id_user其中两行bcc_fs_exam_result具有相同的taken_date和`id_user。