gpt4 book ai didi

MySQL 连接,查询返回所有章节标题和可用的用户等级

转载 作者:行者123 更新时间:2023-11-29 03:45:39 26 4
gpt4 key购买 nike

我有这样的 table :

[users] [chapters] [exam_scores]
- id - title - fk_chapter
- fk_user
- grade

我需要一个查询来返回所有的章节标题和可用的用户等级。这是我的尝试:

select chapters.title as Title, exam_scores.grade as Results
from users, exam_scores left join chapters
on chapters.id = exam_scores.fk_chapter
where exam_scores.fk_user = users.id and users.id = 15;

如果有可用的成绩,则返回记录,但不返回其余章节。

最佳答案

由于要获取所有章节的列表,不管该章节是否有用户评分。因此,您想从章节表中进行选择。然后,由于您想要每一章的结果,您需要 LEFT JOIN exam_scores 表,这样您将获得有分数的行的记录,以及没有分数的记录。当使用自然连接(JOINFROM table, table2, table3)时,仅返回匹配左右值的记录。

因此,您的查询应如下所示:

SELECT c.title Title, s.grade Results
FROM chapters c
LEFT JOIN exam_scores s ON s.fk_chapter = c.id
WHERE (s.fk_user = 15 OR s.fk_user IS NULL)

请注意,您甚至不需要在此处包含 users 表,因为您不会访问它的任何信息。您的查询是加入用户表,然后在其 id 键上执行 WHERE 子句。这不是必需的,除非您要从用户表中获取数据。事实上,如果您确实需要用户表中的数据,您可以像这样将其左联接到 exam_scores 表中:

SELECT c.title Title, s.grade Results, u.*
FROM chapters c
LEFT JOIN exam_scores s ON s.fk_chapter = c.id
LEFT JOIN users u ON u.id = s.fk_user
WHERE (s.fk_user = 15 OR s.fk_user IS NULL)

希望这对您将来应该如何更好地构建查询和 JOIN 有所帮助并阐明一些思路。

编辑:我根据您的评论编辑了我的答案。如果没有附加成绩,您就不会收到回复,这是完全有道理的,原因如下:

当您将 2 个表连接在一起时,它们是通过用户 ID 连接的。这很好,因为当用户 ID 没有映射到章节表时,您会得到用户 ID 和等级的 NULL 值。但是,由于在我们的 WHERE 子句中,我们正在过滤 ID 为 15 的用户,因此它会过滤掉用户列的所有 NULL 值。因此,要解决此问题,您可以在 WHERE 子句中添加一个 OR 语句,说明用户 ID 为 NULL 是可以的。

关于MySQL 连接,查询返回所有章节标题和可用的用户等级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5922319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com