1

我正在尝试查询一些数据来练习,这些是三个表:

course    assignment    assignment_submissions
id        id            id
          course        assignment

如您所见,这些关系非常基本,但我对普通 SQL 很生疏,这就是我练习的原因。

给定 a course 'id',我怎样才能找到assignment_submission属于它的所有行?

我需要得到作业,然后为每个作业得到每个提交。这是我的尝试,但失败并返回比预期大得多的数据集。

SELECT sub.id, sub.grade,
FROM uv_assignment_submissions sub, uv_assignment ass
WHERE ass.course = 1245
4

3 回答 3

3

您尝试的问题是您有三个表的叉积,并且仅限制使用 uv_assignment 中的哪些行。因此,对于课程 1245,即使与该课程无关,您也会展示每个作业,依此类推。

但是,您很接近:

SELECT sub.id, sub.grade,
FROM 
    uv_assignment_submissions sub, uv_assignment ass
WHERE 
    sub.assignment = ass.id
    and ass.course = course.id
    and ass.course = 1245
于 2013-05-03T04:00:31.973 回答
3

您将需要JOIN所有 3 个表courseassignmentassignment_submissions。我使用了一个JOIN结构,假设您仅在存在一些记录时才需要显示课程详细信息assignmentsassignment_submissions

您的查询失败的原因是,它当前从 获取Cartesian所有记录的乘积2 tables,您需要一个条件来通过指定条件来指定哪些行对assignment当前JOIN有效

像这样的东西应该工作

SELECT
  c.id,
  asub.id
FROM
  course c
  JOIN assignment a ON ( c.id = a.course )
  JOIN assignment_submissions asub ON ( asub.ID = a.assignment )
WHERE
  c.id = 10 --your course id goes here OR c.id in (10, 20, 30) -- for multiple IDS

有关 SQL 连接的更多信息:http: //dev.mysql.com/doc/refman/5.0/en/join.html

于 2013-05-03T03:54:09.747 回答
2

尝试这个:

SELECT c.ID AS Course
     , a.id AS Assignment
     , `as`.id AS Assignment_sub
  FROM course c
  JOIN assignment a 
       ON c.id = a.course
  JOIN assignment_submissions `as` 
       ON a.id = `as`.assignment
 WHERE c.id = 1

输出:

╔════════╦════════════╦════════════════╗
║ COURSE ║ ASSIGNMENT ║ ASSIGNMENT_SUB ║
╠════════╬════════════╬════════════════╣
║      1 ║          1 ║              1 ║
║      1 ║          1 ║              2 ║
║      1 ║          2 ║              3 ║
╚════════╩════════════╩════════════════╝

看到这个 SQLFiddle

于 2013-05-03T04:03:56.433 回答