[英]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.