Sql 问题执行左联接两次(乘行)
假设我现在有3个表,一个表包含Sql 问题执行左联接两次(乘行),sql,join,left-join,Sql,Join,Left Join,假设我现在有3个表,一个表包含课程,一个表包含这些课程的评分,还有一个表包含这些课程的用户 Lessons是一个非常常规的表,其他两个表是如下所示的关系表: TABLE LESSONS ID | NAME | DESCRIPTION | CREATED BY | APPROVED BY | LEVEL | DATE CREATED | LAST EDIT 1 les1 desc1 10 12 1 12-12-2000
课程
,一个表包含这些课程的评分
,还有一个表包含这些课程的用户
Lessons是一个非常常规的表,其他两个表是如下所示的关系表:
TABLE LESSONS
ID | NAME | DESCRIPTION | CREATED BY | APPROVED BY | LEVEL | DATE CREATED | LAST EDIT
1 les1 desc1 10 12 1 12-12-2000 12-12-2000
2 les2 desc2 23 12 2 12-12-2000 12-12-2000
3 les3 desc3 12 12 3 12-12-2000 12-12-2000
TABLE RATINGS
ID | LESSON | USER | RATING | COMMENT
1 1 60 5 very good
2 2 30 4 nice
3 2 62 4 my comment
4 3 65 3 nice
5 3 78 5 very good
6 1 26 1 very bad
6 1 45 3 other comment
TABLE LESSONSXUSERS
ID | LESSON | USER | STATUS
1 1 60 2
2 1 26 2
2 1 45 2
3 2 30 2
4 2 62 2
5 3 65 2
6 3 78 2
7 1 22 1
8 1 19 1
我试图生成一个视图,只显示批准的课程,并从其他两个表中提取一些信息:
CREATE OR REPLACE VIEW `skn_approved_lessons` AS
select
`l`.`id_skn_lessons` AS `id_skn_lessons`,
`l`.`name` AS `name`,
`l`.`description` AS `description`,
`l`.`createdBy` AS `createdBy`,
`l`.`approvedBy` AS `approvedBy`,
`l`.`id_skn_lessonsLevels` AS `id_skn_lessonsLevels`,
`l`.`dateCreated` AS `dateCreated`,
`l`.`lastEdit` AS `lastEdit`,
AVG(`lr`.`rating`) AS `avgScore`,
COUNT(`lxu`.`id_skn_users`) AS `students`
from ((`skn_lessons` AS `l`
left join `skn_lessonsRatings` AS `lr` on `l`.`id_skn_lessons` = `lr`.`id_skn_lessons`) left join `skn_lessonsXusers` AS `lxu` on `lxu`.`id_skn_lessons` = `l`.`id_skn_lessons`)
where ((`l`.`approvedBy` is not null) and
(`l`.`approvedBy` <> `l`.`createdBy`))
group by `l`.`id_skn_lessons`;
但我明白了:
VIEW APPROVED
ID | NAME | DESCRIPTION | CREATED BY | APPROVED BY | LEVEL | DATE CREATED | LAST EDIT | AVG RATING | STUDENTS
1 les1 desc1 10 12 1 12-12-2000 12-12-2000 3 15
2 les2 desc2 23 12 2 12-12-2000 12-12-2000 4 4
3 les3 desc3 12 12 3 12-12-2000 12-12-2000 4 4
注意用户栏是错误的,我真正得到的是users
xamountfratings
的产品。它通过评级的每个注册表对用户的每个注册表进行查询,因此我总是会得到用户
x评级
作为用户
的数量,这不是我想要的
我不太明白在按lesson.id
分组后如何进行第二次联接,我想这将解决问题
提前感谢。我相信您所需要做的就是将DISTINCT参数添加到COUNT aggregate函数中,如下所示:
COUNT(DISTINCT lxu.id_skn_users)
添加DISTINCT参数将返回该列中唯一非空值的数目
我看到Barmar已经在上面的评论中提到了这一点。你能做一个sqlfiddle吗?我试着根据您发布的数据制作一个,但列名与查询中的列不同。是否有两个id=6的评分和两个id=2的LESSONSXUSERS的输入错误?无论如何,创建SQLFIDLE可能是一个好主意。我认为您可能只需要使用COUNT(DISTINCT lxu.id\u skn\u users)
,但我想在发布答案之前对其进行测试。DISTINCT正是我所缺少的,它似乎有效:)
COUNT(DISTINCT lxu.id_skn_users)