我有一个查询,它返回具有 status = "offering"
的类(class),并且由该用户提供
,该用户还拥有一个 courseid “3”的类(class)“
现在问题是
有一个 sc_c_material 表,其中包含针对类(class)的 2 条记录,我想对此显示 2 个单独的行,其中 1 行包含 sc_course 数据和 sc_c_material 的第一个记录,第二行再次包含 sc_course 数据和 sc_c_material 的第二个记录
对于id 9
的类(class),以下查询仅返回1条记录
,其中id 9
有2条记录
在 sc_c_materials
表中。我想要 sc_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)
最佳答案
首先,我将首先使用 ANSI SQL-92 样式查询来显示连接关系,而不是在 where 子句中将它们全部批量化。它可以更好地可视化表 X 与表 Y 的关系(尽管您的 SQL-89 格式仍然有效)。另外,您应该只需要在字段周围加上 tic ` 标记,因为保留字也是列名,因此可能会导致问题。
底层查询应该有效,但是,通过查看连接条件,我发现 Material 表已连接到作者和质量表。如果任一表的 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 子句中的所有条件),因此您的查询告诉引擎...我只想要找到所有片段的记录,因此它忽略了以下记录:无论哪个表缺少链接,都没有匹配项。
关于Mysql连接查询帮助显示2条单独的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18101308/