2013-02-28 83 views
1

我得到了三張表,cours,文檔和cours_document。INNER JOIN MySQL空條目

我想選擇所有沒有文檔的庫。 我已經試過這樣:

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被定義,並且select,cours在FROM子句中...我嘗試使用別名(cid),MySQL回答我相同...

回答

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 
+0

好吧,我想知道如果我需要做一個子查詢。謝謝老兄:) – vekah 2013-02-28 09:20:54

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 

再見!

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工作)。

+0

LEFT JOIN和LEFT OUTER JON有什麼區別? – vekah 2013-02-28 09:46:43

+0

沒什麼。 LEFT JOIN只是LEFT OUTER JOIN的縮寫。 – Kickstart 2013-02-28 09:53:01