Mysql连接查询帮助显示2条单独的记录

标签 mysql database join

我有一个查询,它返回具有 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 92条记录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/

相关文章:

python - Django 管理员 : Turning off DB transactions

ruby-on-rails - 在不使用 Rails 迁移的情况下更新数据库模式

c# - JOIN 对象集合的多个属性的正确方法?

python - 如何找到两个数据框的补充

php - 更新数据库中的 ID

php - 如何使用 PHP 和 jQuery 将 DIV 标签保存到 MySQL

mysql - Nodejs mysql查询相互依赖

c# - 在离线 .mdb 文件和在线 .mdb 文件之间同步数据库

SQL:每个特定时间戳只需要 1 行

php - Laravel Dompdf 如何一起下载两个pdf文件