我有三张桌子,桌子,文件和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回答我同样的事情......
答案 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工作)。