【问题标题】:SQL query - dynamic sub querySQL查询——动态子查询
【发布时间】:2012-05-28 09:43:54
【问题描述】:

我在尝试创建查询时遇到问题:

选择所有在特定周内没有完成所有同行评审的学生。

背景:每周,每个学生都必须对同一组中的同龄人进行同行评审。

每个组的大小可能不同,这就是我遇到的问题。

这是我目前的测试数据:

表 1:同行评审表
表 2:学生表。

这是我的初始查询,根据学生同行评审的数量对所有学生进行分组。我现在需要检查count(*) 是否小于每个学生的小组大小:

SELECT * 
FROM peerreview
RIGHT JOIN student 
ON student. studentID = peerreview.reviewer
WHERE week = 11
GROUP BY studentID
HAVING Count(*) < ????

【问题讨论】:

  • “WHERE week = 11”位有效地将您的 RIGHT JOIN 转换为 INNER JOIN。
  • 只需给出两个 d 表的列名和公共 id b/w。\

标签: mysql sql


【解决方案1】:

以下查询将返回对同一组中的所有学生进行审核的学生。

 SELECT a.reviewer, 
       a.groupid 
FROM   (SELECT student2.studentID AS reviewer, 
               student1.groupid, 
               Count(*)           AS cnt 
        FROM   student student1 
               INNER JOIN peerreview 
                       ON student1.studentID = peerreview.reviewee 
               INNER JOIN STUDENT STUDENT2 
                       ON student2.studentID = peerreview.reviewer 
        WHERE  student2.groupid = student2.groupid 
               AND peerreview.week = 11 
        GROUP  BY student1.groupid, 
                  student2.studentID) a 
       INNER JOIN (SELECT groupid, 
                          Count(*) - 1 AS cnt 
                   FROM   student 
                   GROUP  BY groupid) b 
               ON a.groupid = b.groupid 
                  AND a.cnt = b.cnt 

See SqlFiddle

【讨论】:

  • 很好,你能解释一下student2是什么吗?
  • 这称为别名。您可以看到我们在查询中使用了两次学生表,因此我们给它们起了一个昵称来区分它们。查询对您有用吗?
  • 那种。我认为您的子查询给了我经过同行评审的学生。我要求为小组中的所有同龄人完成复习的学生。
  • @dgamma3 现在查看修改后的帖子。
  • 这个查询是用一些技巧解决的,所以不能把它转换成简单的步骤。
【解决方案2】:
Select S.StudentId As Reviewer
    , S1.StudentId As StudentYetToBeReviewed
    , Weeks.WeekNum
From Student As S
    Join Student As S1
        On S1.GroupId = S.GroupId
            And S1.StudentId <> S.StudentId
    Cross Join  (
                Select 7 As WeekNum
                Union All Select 11
                ) As Weeks
Where Not Exists    (
                    Select 1
                    From PeerReview As P1
                    Where P1.reviewee = S1.StudentId
                        And P1.Week = Weeks.WeekNum
                    )
Order By WeekNum, reviewer

这会按周为您提供审阅者和他们需要审阅的人员的列表。在真正的解决方案中,您可能希望将 Cross Join of week 替换为一个不同的周列表,其中应该进行审核。

SQL Fiddle版本

【讨论】:

    【解决方案3】:
      select distinct s1.* 
      from student s1 inner join student s2 on s1.groupId = s2.groupeId
                   left join peerreview pr on pr.revieweer = s1.studentId
                        and pr.reviewee =  s2.studentId
      where pr.Week = ? and  pr.revieweer is null and s1.studentId <> s2.studentId
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 2014-09-13
      • 2010-09-20
      • 2015-09-20
      • 2017-01-11
      • 1970-01-01
      相关资源
      最近更新 更多