繁体   English   中英

MySQL查询不存在

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM