错误 #1066 - MySQL 中的表/别名不是唯一的

Posted

技术标签:

【中文标题】错误 #1066 - MySQL 中的表/别名不是唯一的【英文标题】:Error #1066 - Not unique table/alias in MySQL 【发布时间】:2016-09-05 10:30:01 【问题描述】:

我的 SQL 语句有问题,我收到错误消息

#1066 - 不是唯一的表/别名:'students'

下面是我的代码:

SELECT batches.*,students.*, courses.course_name AS course_name,
count(DISTINCT IF(attendances.student_id = students.id AND attendances.permitted = 0,attendances.id ,NULL)) AS absents_count,
count(DISTINCT IF(batches.id = students.batch_id ,students.id ,NULL)) AS students_count, count(DISTINCT IF(attendances.student_id = students.id AND attendances.permitted = 1,attendances.id ,NULL)) AS leaves_count 
FROM `batches`   
INNER JOIN courses ON courses.id = batches.course_id 
LEFT OUTER JOIN attendances ON attendances.batch_id = batches.id AND attendances.month_date = '2016-09-05'  
LEFT OUTER JOIN students ON students.id = attendances.student_id AND students.batch_id = batches.id 
INNER JOIN students ON  batches.id = students.batch_id 
WHERE ('2016-09-05' BETWEEN batches.start_date AND batches.end_date AND batches.is_active = 1 AND batches.is_deleted = 0 AND courses.is_deleted = 0 ) 
GROUP BY batches.id 
ORDER BY courses.course_name,batches.id 
LIMIT 0, 10;

leaves_count 和absents_count 工作正常,但是当我为students_count 添加代码时,会出现上述错误。

【问题讨论】:

【参考方案1】:

为表 students 和所有相关列使用不同的别名

select <Fields to be seleced>
FROM `batches`   
INNER JOIN courses ON courses.id = batches.course_id 
LEFT OUTER JOIN attendances ON attendances.batch_id = batches.id AND attendances.month_date = '2016-09-05'  
LEFT OUTER JOIN students st1 ON st1.id = attendances.student_id AND students.batch_id = batches.id 
INNER JOIN students st2 ON  batches.id = st2.batch_id 
WHERE ('2016-09-05' BETWEEN batches.start_date AND batches.end_date AND batches.is_active = 1 AND batches.is_deleted = 0 AND courses.is_deleted = 0 )  GROUP BY batches.id ORDER BY courses.course_name,batches.id LIMIT 0, 10;

【讨论】:

【参考方案2】:

您要加入表students 两次,并且在选择和位置列表中它不知道应该从哪个表中获取数据。您需要在至少一个连接中为您的表添加别名,例如替换:

LEFT OUTER JOIN students ON 
  students.id = attendances.student_id AND students.batch_id = batches.id 
INNER JOIN students ON  
  batches.id = students.batch_id 

与:(请注意,我已经替换了它们只是为了向您展示这一点)

LEFT JOIN students AS s1 ON 
  s1.id = attendances.student_id AND s1.batch_id = batches.id 
INNER JOIN students AS s2 ON  
  batches.id = s2.batch_id 

您还需要在整个查询中将每个列引​​用从 students 替换为 s1s2 以正确检索/限制您的查询。

我还删除了左连接中的 OUTER 部分,因为它是多余的。

【讨论】:

以上是关于错误 #1066 - MySQL 中的表/别名不是唯一的的主要内容,如果未能解决你的问题,请参考以下文章

帮助 MySQL 查询语法:错误 #1066 - 不是唯一的表/别名

#1066 - 错误不是唯一的表别名

为啥错误 #1066 - 不是唯一的表/别名:'cat_rapoarte'

错误代码:1066。不是唯一的表/别名:'circle_call_prefixes'

发生数据库错误错误号:1066 不是唯一的表/别名:[重复]

Laravel - 语法错误或访问冲突:1066 不是唯一的表/别名