Error #1066 - Not unique table/alias in MySQL

2019-09-11 05:56发布

I am having problem in my SQL statement, I get the error

#1066 - Not unique table/alias: 'students'

Below is my code:

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 and absents_count works fine but when I add code for students_count it gives the mentioned error.

2条回答
SAY GOODBYE
2楼-- · 2019-09-11 06:18

You are joining to a table students twice and in the select and where list it wouldn't know from which table it should take the data. You need to alias your table in at least one join, so for example replace:

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 

With: (note I've replaced both of them just to show you the point)

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 

You also need to replace every column reference from students to either s1 or s2 in entire query to retrieve/constraint your query properly.

I've also removed the OUTER part in left join as it is superfluous.

查看更多
【Aperson】
3楼-- · 2019-09-11 06:32

use different aliasses for the table students and all related columns

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;
查看更多
登录 后发表回答