INNER JOIN MySQL空条目

时间:2013-02-28 08:58:10

标签: mysql join inner-join

我有三张桌子,桌子,文件和cours_document。

我想选择所有没有文件的人。 我试过这个:

SELECT cours.id AS cid, cours.name AS cname, DATE_FORMAT(cours.date,"%H:%i") AS cdate, DATE_FORMAT(cours.date,"%a") AS jour,sessions.id AS sid,sessions.name AS sname,sessions.restant,session_cours.session_id,session_cours.cours_id, ISNULL(cours.video_id) AS isVid
FROM cours,sessions,session_cours
INNER JOIN cours_document ON cours.id=cours_document.cours_id AND COUNT(cours_id)=0
WHERE cours.prof_id = :prof_id
AND sessions.prof_id = :prof_id
AND session_cours.cours_id=cours.id
AND sessions.id=session_cours.session_id
AND DATE_FORMAT(cours.date,"%Y-%m-%d") >= :date_min
AND DATE_FORMAT(cours.date,"%Y-%m-%d") <= :date_max
GROUP BY cours.id ORDER BY date ASC

但是这个查询不起作用。 SQL告诉我:Column not found: 1054 Unknown column cours.id in on clause (500 Internal Server Error)

第一个问题,这个查询可以工作吗? (我的意思是ON [...] AND COUNT(cours_id)=0

而且,为什么会出现这个错误?我的意思是cours.id是定义的,选择,cours是在FROM子句上...我尝试使用别名(cid),MySQL回答我同样的事情......

3 个答案:

答案 0 :(得分:1)

此查询无效。你正在尝试INNER JOIN一个count(...)= 0的表,所以没有记录要加入!

这样做的正确方法是:

SELECT cours.id AS cid, cours.name AS cname, DATE_FORMAT(cours.date,"%H:%i") AS cdate, DATE_FORMAT(cours.date,"%a") AS jour,sessions.id AS sid,sessions.name AS sname,sessions.restant,session_cours.session_id,session_cours.cours_id, ISNULL(cours.video_id) AS isVid
FROM cours,sessions,session_cours
WHERE cours.prof_id = :prof_id
AND sessions.prof_id = :prof_id
AND session_cours.cours_id=cours.id
AND sessions.id=session_cours.session_id
AND DATE_FORMAT(cours.date,"%Y-%m-%d") >= :date_min
AND DATE_FORMAT(cours.date,"%Y-%m-%d") <= :date_max
AND (SELECT COUNT(*) FROM cours_document WHERE cours.id=cours_document.cours_id) = 0
GROUP BY cours.id ORDER BY date ASC

答案 1 :(得分:1)

您可以选择不在cours_document表中的所有记录(然后它们没有文档..)

SELECT cours.id AS cid, cours.name AS cname, DATE_FORMAT(cours.date,"%H:%i") AS cdate,
DATE_FORMAT(cours.date,"%a") AS jour,sessions.id AS sid,sessions.name AS
sname,sessions.restant,session_cours.session_id,session_cours.cours_id,
ISNULL(cours.video_id) AS isVid
FROM cours,sessions,session_cours
WHERE cours.prof_id = :prof_id
AND sessions.prof_id = :prof_id
AND session_cours.cours_id=cours.id
AND sessions.id=session_cours.session_id
AND DATE_FORMAT(cours.date,"%Y-%m-%d") >= :date_min
AND DATE_FORMAT(cours.date,"%Y-%m-%d") <= :date_max
**and cours.id not in (Select distinct cours_id from cours_document )**
GROUP BY cours.id ORDER BY date ASC

再见!

答案 2 :(得分:1)

使用子选择是不必要的,通常会导致性能不佳。您可以使用左连接并忽略匹配记录的记录。

SELECT cours.id AS cid, cours.name AS cname, DATE_FORMAT(cours.date,"%H:%i") AS cdate, DATE_FORMAT(cours.date,"%a") AS jour,sessions.id AS sid,sessions.name AS sname,sessions.restant,session_cours.session_id,session_cours.cours_id, ISNULL(cours.video_id) AS isVid
FROM cours
INNER JOIN session_cours ON session_cours.cours_id=cours.id
INNER JOIN sessions ON sessions.id=session_cours.session_id
LEFT OUTER JOIN cours_document ON cours.id=cours_document.cours_id 
WHERE cours_document.cours_id IS NULL
AND cours.prof_id = :prof_id
AND sessions.prof_id = :prof_id
AND DATE_FORMAT(cours.date,"%Y-%m-%d") >= :date_min
AND DATE_FORMAT(cours.date,"%Y-%m-%d") <= :date_max
GROUP BY cours.id 
ORDER BY date ASC

你可能也不应该在这里使用GROUP BY,但不完全确定你想要什么(也许你只是用它来让COUNT工作)。