[英]mySQL Query NOT EXISTS
我被困在一個mySQL查詢上,我只是無法理解。 我目前正在編寫一個PHP程序,可以幫助解決教科書問題。 我有一個帶有2個表的mySQL數據庫。
Books table
PID ISBN BKNAME CID
Issued table
PID SNR ISBN CAMPUSNR DATE
發行書籍的人將輸入學生編號,並顯示該學生必須為其注冊的課程收到的所有書籍。 像這樣:
$stmt = $db->prepare("SELECT isbn,bkname,cid FROM books WHERE (cid = :course)");
$stmt->bindValue(':course', $StudCourse, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
每本書后面都會在屏幕上顯示一個復選框。 然后,發行人在他給學生的書上打勾,然后單擊發行按鈕。 然后將此數據插入數據庫中,如下所示:
$stmt = $db->prepare("INSERT INTO issued(snr,isbn,campusnr,date) VALUES (:snr,:isbn,:campusnr,:date)");
$stmt->bindValue(':snr', $Studnr, PDO::PARAM_INT);
$stmt->bindValue(':isbn',$Ticked[$Num], PDO::PARAM_INT);
$stmt->bindValue(':campusnr', $Campus, PDO::PARAM_INT);
$stmt->bindValue(':date', $IssueDate, PDO::PARAM_STR);
這樣做的問題是,如果以后要向運行第一條語句的學生發行更多的書,則會導致錯誤,如果發行人在書后的方框中打錯了錯誤,則可能再次發行同一本書。
有沒有一種方法可以在第一個語句中僅顯示仍需要發行的書籍。 我已經嘗試了以下mySQL語句:
SELECT *
FROM books
INNER JOIN issued ON books.isbn = issued.isbn
WHERE snr = '151107549'
AND NOT EXISTS (
SELECT isbn, bkname, cid
FROM books
WHERE cid = 'NC3OA'
)
但是,我沒有任何結果。 MySQL專家可能會提供一些幫助嗎?
SELECT books.isbn,books.bkname,books.cid
FROM books
LEFT JOIN issued ON books.isbn = issued.isbn AND issued.snr = :snr
WHERE books.cid = :course AND issued.isbn IS NULL
ORDER BY books.isbn ASC
看看這個解釋JOIN
的偉大人物:
您希望books
具有特定cid
所有行。 現在要從issued
刪除行,您可以執行LEFT JOIN
並檢查鍵是否為NULL
:
SELECT books.isbn, books.bkname, books.cid FROM books
LEFT JOIN issued
ON books.isbn = issued.isbn
WHERE cid = :course
AND issued.isbn IS NULL
你是正確使用NOT EXISTS這里,你正在尋找在沒有問題的條目還存在那些書。 但是,您沒有正確使用EXISTS子句。 您在問:如果數據庫中沒有cid NC3OA的書籍,請只給我結果,因此您永遠不會獲得任何記錄。 (以某種方式您的陳述看起來很混亂;內部聯接將為您提供已發行而不是未發行的書。)
我的理解是:您希望某門課程的所有書籍都已發行給學生。 這是正確的聲明:
SELECT *
FROM books
WHERE cid = 'NC3OA'
AND NOT EXISTS
(
SELECT *
FROM issued
WHERE issued.isbn = books.isbn
AND snr = '151107549'
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.