Sql 问题执行左联接两次(乘行)

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

假设我现在有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     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
x
amountfratings
的产品。它通过
评级的每个注册表对
用户的每个注册表进行查询,因此我总是会得到
用户
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)