【问题标题】:Convert this subquery into a JOIN?将此子查询转换为 JOIN?
【发布时间】:2013-12-19 21:10:28
【问题描述】:

有谁知道是否可以将此子查询转换为 JOIN?

SELECT DISTINCT

lastname,
c.fullname,

(SELECT COUNT(lg.action) FROM tbl_log AS lg WHERE lg.userid = u.id AND lg.course = c.id) AS 'Total Course Hits Per Student'

FROM tbl_user AS u    
JOIN tbl_user_enrolments AS ents ON ents.userid = u.id    
JOIN tbl_enrol AS en ON ents.enrolid = en.id    
JOIN tbl_course AS C ON c.id = en.courseid    
JOIN tbl_context AS ctx ON c.id = ctx.instanceid    
JOIN tbl_role_assignments AS ra ON ra.contextid = ctx.id AND ra.userid = u.id       

LOG TABLE     

+-------------+---------------------+------+-----+---------+----------------+  
| Field       | Type                | Null | Key | Default | Extra          |  
+-------------+---------------------+------+-----+---------+----------------+  
| id          |                     | NO   | PRI | NULL    | auto_increment |  
| time        |                     | NO   |     | NULL    |                |  
| userid      |                     | NO   |     | NULL    |                |  
| course      |                     | NO   |     | NULL    |                |  
| action      |                     | NO   |     | NULL    |                |  
+-------------+---------------------+------+-----+---------+----------------+  

USER Table

+--------------+---------------------+------+-----+---------+----------------+  
| Field        | Type                | Null | Key | Default | Extra          |  
+--------------+---------------------+------+-----+---------+----------------+  
| id           |                     | NO   | PRI | NULL    | auto_increment |  
| username     |                     | NO   |     | NULL    |                |  
| userpassword |                     | NO   |     | NULL    |                |  
| lastname     |                     | NO   |     | NULL    |                |  
| firstname    |                     | NO   |     | NULL    |                |  
+--------------+---------------------+------+-----+---------+----------------+  

COURSE table

+--------------+---------------------+------+-----+---------+----------------+  
| Field        | Type                | Null | Key | Default | Extra          |  
+--------------+---------------------+------+-----+---------+----------------+  
| id           |                     | NO   | PRI | NULL    | auto_increment |  
| category     |                     | NO   |     | NULL    |                |  
| fullname     |                     | NO   |     | NULL    |                |  
| shortname    |                     | NO   |     | NULL    |                |   
+--------------+---------------------+------+-----+---------+----------------+  

我通过注册表和上下文表将用户链接在一起。

【问题讨论】:

    标签: mysql join count subquery


    【解决方案1】:

    你不能对 log_table 进行查询

    SELECT 
        COUNT(tbl_log.action)
        lastname,
        c.fullname,
    FROM tbl_log
    JOIN tbl_user ON tbl_log.userid = tbl_user.id
    JOIN tbl_course ON tbl_log.course = tbl_course.id
    GROUP BY tbl_log.userid, tbl_log.course
    

    我不知道您是否需要其他表?如果我没记错的话,这将提供一个计数、学生姓名和课程名称。但是,您只能获得实际的日志,因此对于没有做任何事情的学生不会发生任何事情。

    否则,日志表上的 OUTER JOIN 可能就足够了。我现在没有时间检查 SQL 小提琴。希望这对您有所帮助。

    【讨论】:

    • 感谢您的帮助,即使用户没有执行任何操作(零),我也想识别学生的操作。最终,我想计算每门课程的最低行动数,即使这是零。希望阅读,当然,最低的行动计数。
    • 嗨@luckylwk,你的MySQL看起来不错,回答了我最初的问题。我的第一个问题含糊不清,如果一门课程有 20 人,我试图找到使用率最低的学生。下一步是计算课程中任何学生的最低使用量:code SELECT u.lastname, c.fullname, MIN(COUNT(lg.action)) FROM tbl_log AS lg JOIN tbl_user AS u ON lg.userid = u.id JOIN tbl_course AS c ON lg.course = c.id GROUP BY lg.course, lg.userid code 但我的 MIN() 函数不起作用。我对组函数的使用无效。
    • 那行不行,因为 MIN 函数将返回一行,而不是 MIN 的 bool。您可以 ORDER BY COUNT(lg.action) ASC 将最小计数放在第一行。
    • 再次感谢@luckylwk。我遇到了这个问题。我想要每门课程 1 行(每门课程的最低值),但在其他实验中,我每门课程只有一行。例如,我追求的是课程,最低使用率(数量),课程重复,最低数量。有没有办法在没有子查询的情况下实现这一目标?我已经设法让一个子查询来做到这一点,但后来却被困在将它添加到一个更大的查询中。
    • 谢谢luckylwk。这几乎就是我所追求的。我唯一的问题是 mdl_log 表中的每条记录都是一个动作。因此,这计算了每门课程的所有动作。比如说,课程中有 20 个用户,我试图找到最少的操作。这就是我一直使用计数的原因。我一直在尝试将其总结如下:Stack overflow minimum count 但没有运气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2020-05-27
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多