简体   繁体   中英

SQL sub queries

I need to get (count of completed modules) along with (count of course modules) in a (course) for an (user)

Tables:

course_modules - will have all the course modules
course_modules_completion - will have all the users with completed modules.

I want to show all the three in one query like example:

(course)  (count of course modules) (count of completed modules) (userid)
   3               20                        5                      12
   5               20                        8                      7

Here is the query I tried :

 SELECT
    c.fullname, count(cm.id) AS "coursemodules", cmc.userid,
    (SELECT count(cmc.coursemoduleid) 
     FROM mdl_course c 
         JOIN mdl_course_modules cm 
         JOIN mdl_modules m 
         JOIN mdl_course_modules_completion cmc ON c.id = cm.course 
           AND cm.module = m.id 
           AND cmc.coursemoduleid = cm.id 
           AND cmc.userid = 12 
           AND cm.course = 7 
           AND cmc.completionstate BETWEEN 1 AND 10) AS "completedmodules"
    FROM
    mdl_course c 
       JOIN mdl_course_modules cm 
       JOIN mdl_modules m 
          ON c.id = cm.course AND cm.module = m.id AND cm.course = 7

It shows an error:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT count(cmc.coursemoduleid) FROM mdl_course c JOIN mdl_course_modules cm JO' at line 3

Could anyone suggest me?

Data for course_modules
id course moduletypeid
1    3     9 
2    3     9
3    3     17
4    5     20
5    5     18

Data for course_modules_completion
id  coursemoduleid userid
1      153           12
2      154           12
3      155           11
4      120           12
5      167            11

Should be

FROM mdl_course c 
         JOIN mdl_course_modules cm ON c.id = cm.course
         JOIN mdl_modules m ON cm.module = m.id
         JOIN mdl_course_modules_completion cmc ON 
           cmc.coursemoduleid = cm.id 
WHERE
           AND cmc.userid = 12 
           AND cm.course = 7 
           AND cmc.completionstate BETWEEN 1 AND 10

UPDATE

You can try to get rid of the subquery in SELECT and replace it with

SUM(if (cmc.completionstate BETWEEN 1 AND 10,1,0) AS "completedmodules"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM