0

我有这个查询,它返回有课程status = "offering"offered by that user谁也有课程的课程,courseid "3"现在的问题

有一个 sc_c_material 表,其中有 2 条记录针对一门课程我想显示 2 条单独的行,其中 1 行有 sc_course 数据,第 1 条记录为 sc_c_material,第 2 行有 sc_course 数据,第 2 条记录为 sc_c_material

以下查询表中包含where的only return 1 record课程。我想要这两个表中的记录id 9id 92 recordssc_c_materialssc_c_material

我希望我已经澄清了我的观点,因为这有点难以解释

SELECT c.`id`,
     c.`coursecode`,
     m.`title`,
     a.`author_name`,
     q.`quality`,
     m.`comments`,
     s.status,
     u.id,
     m.`material`
FROM sc_courses c,
     sc_status s,
     sc_c_materials m, 
     sc_authors a,
     sc_quality q,
     users u
WHERE c.`statusid`=s.`id`
    AND c.`userid`=u.`id`
    AND m.`qualityid`=q.`id`
    AND m.`authorid`=a.`id`
    AND c.`id`=m.`courseid`
    AND s.`status`="offering"
    AND c.`userid` IN (SELECT userid 
                FROM sc_courses 
                WHERE id="3" 
                GROUP BY userid)
4

1 回答 1

1

首先,我将首先使用 ANSI SQL-92 样式的查询来显示连接关系,而不是将它们全部放在 where 子句中。它可以更好地可视化表 X 与表 Y 的关系(尽管您的 SQL-89 格式仍然有效)。此外,由于保留字也是列名,您应该只需要在可能导致问题的字段周围使用 tic ` 标记。

基础查询应该有效,但是,通过查看连接条件,我看到材料表已连接到作者和质量表。如果任何一个表的 ID 关系缺失/无效,则只返回一条记录。在这种情况下,我已更改为 LEFT-JOIN 以查看是否确实如此

SELECT 
      c.id,
      c.coursecode,
      m.`title`,
      a.author_name,
      q.quality,
      m.comments,
      s.status,
      u.id,
      m.material
   FROM 
      sc_courses c
         JOIN sc_status s
            ON c.statusid = s.id
           AND s.status= 'offering'

         JOIN sc_c_materials m
            ON c.id= m.courseid

            LEFT JOIN sc_authors a
               ON m.authorid = a.id
            LEFT JOIN sc_quality q
               ON m.qualityid = q.id

         JOIN users u
            ON c.userid = u.id
   WHERE
      c.userid IN (SELECT userid 
                FROM sc_courses 
                WHERE id='3'
                GROUP BY userid)

LEFT-JOIN 意味着我想要在 from table 子句中首先列出的 LEFT 表中的所有内容......在这种情况下,sc_c_materials(与作者和质量有关)不管在作者或质量表中实际找到匹配项。因此,在这些其他表中的此类未找到元素期间,您可能尝试从它们中提取的任何列都将返回为 NULL。

由于您最初有一个隐含的 INNER JOIN (您的所有条件直接在 where 子句中),您的查询告诉引擎......我只想要找到所有片段的记录,所以它忽略了没有的记录无论哪个表中的匹配都缺少链接。

于 2013-08-07T12:47:04.467 回答