1

3つのテーブル、cours、documents、および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が定義されており、select、coursはFROM句にあります...エイリアス(cid)を使用しようとすると、MySQLが同じように応答します...

4

3 に答える 3

1

このクエリは機能しません。count(...) = 0 のテーブルを INNER JOIN しようとしているため、結合するレコードがありません!

それを行う適切な方法は次のとおりです。

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
于 2013-02-28T09:02:53.063 に答える
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 を機能させるために使用していたのかもしれません)。

于 2013-02-28T09:41:54.493 に答える
1

You can select all records that are not in cours_document table (then they don't have documents..)

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

Bye!

于 2013-02-28T09:13:07.033 に答える