Php 无法正确实现联接

Php 无法正确实现联接,php,mysql,Php,Mysql,我想弄明白 (图书编号、分行编号、总份数、可用数量) 以下是模式: 以下是我所做的: SELECT TITLE, A.BOOK_ID, A.BRANCH_NAME, A.BRANCH_ID, NO_OF_COPIES, COUNT(BOOK_LOANS.BOOK_ID) AS NUM_OUT, NO_OF_COPIES - COUNT(BOOK_LOANS.BOOK_ID) AS NUM_AVAIL, AUTHOR_NAME

我想弄明白

(图书编号、分行编号、总份数、可用数量)

以下是模式:

以下是我所做的:

SELECT
  TITLE,
  A.BOOK_ID,
  A.BRANCH_NAME,
  A.BRANCH_ID,
  NO_OF_COPIES,
  COUNT(BOOK_LOANS.BOOK_ID) AS NUM_OUT,
  NO_OF_COPIES - COUNT(BOOK_LOANS.BOOK_ID) AS NUM_AVAIL,
  AUTHOR_NAME                                      
FROM
  (SELECT
    TITLE,
    BOOK.BOOK_ID,
    BOOK_COPIES.BRANCH_ID,
    BRANCH_NAME,
    NO_OF_COPIES,
    BOOK_AUTHORS.AUTHOR_NAME                                          
  FROM
    BOOK,
    BOOK_COPIES,
    LIBRARY_BRANCH,
    BOOK_AUTHORS                                          
  WHERE
    BOOK_COPIES.BOOK_ID=BOOK.BOOK_ID 
    AND BOOK_AUTHORS.BOOK_ID = BOOK.BOOK_ID 
    AND (
      BOOK.TITLE LIKE :title 
      OR BOOK.BOOK_ID = :book_id 
      OR BOOK_AUTHORS.AUTHOR_NAME LIKE :author_name
    )                                          
    AND BOOK_COPIES.BRANCH_ID=LIBRARY_BRANCH.BRANCH_ID) AS A 
LEFT OUTER JOIN
  BOOK_LOANS 
    ON A.BOOK_ID=BOOK_LOANS.BOOK_ID 
    AND A.BRANCH_ID=BOOK_LOANS.BRANCH_ID 
GROUP BY
  A.BOOK_ID,
  A.BRANCH_ID
但我遇到的问题是,因为BOOK_AUTHORS表中的一本书有多个作者。所以我能够理解,只在book_id上加入book和book_作者,而我应该能够完全使用book_id和author_名称

因此,对于帐簿贷款中的单个条目,它返回计数2次

e、 g.如果图书id为1234的图书签出一次,且其总拷贝数为2,则应将剩余拷贝数返回为1。但它返回0

请帮助我了解如何修复此问题


注意:我使用的是php prepare语句。

我没有注意到您的查询(对我来说太复杂了)

  • COUNT(不同的BOOK\u LOANS.BOOK\u ID)
    而不是
    COUNT(BOOK\u LOANS.BOOK\u ID)
    。如果查询除了计数之外运行良好,DISTINCT将非常有用
  • 业绩很重要。我想内联视图太复杂了。我不知道是否有这样的变化

    SELECT
        DISTINCT BOOK.BOOK_ID
    FROM
        BOOK INNER JOIN BOOK_AUTHORS USING(BOOK_ID)                                     
    WHERE
          BOOK.TITLE LIKE :title 
          OR BOOK.BOOK_ID = :book_id 
          OR BOOK_AUTHORS.AUTHOR_NAME LIKE :author_name
    
    SELECT
    TITLE,
    BOOK.BOOK_ID,
    LIBRARY_BRANCH.BRANCH_NAME,
    LIBRARY_BRANCH.BRANCH_ID,
    BOOK_COPIES.NO_OF_COPIES,
    COUNT(distinct BOOK_LOANS.BOOK_ID) AS NUM_OUT,
    BOOK_COPIES.NO_OF_COPIES - COUNT(distinct BOOK_LOANS.BOOK_ID) AS NUM_AVAIL,
    AUTHOR_NAME  
    
    FROM
      (
        SELECT
            DISTINCT BOOK.BOOK_ID
        FROM
            BOOK,
            BOOK_AUTHORS                                          
        WHERE
              BOOK.TITLE LIKE :title 
              OR BOOK.BOOK_ID = :book_id 
              OR BOOK_AUTHORS.AUTHOR_NAME LIKE :author_name
      ) AS A 
    INNER JOIN BOOK USING(BOOK_ID)
    INNER JOIN BOOK_AUTHORS USING (BOOK_ID)
    INNER JOIN BOOK_COPIES USING(BOOK_ID) 
    INNER JOIN LIBRARY_BRANCH USING(BRANCH_ID)
    LEFT OUTER JOIN
      BOOK_LOANS 
        ON BOOK.BOOK_ID=BOOK_LOANS.BOOK_ID 
        AND LIBRARY_BRANCH.BRANCH_ID=BOOK_LOANS.BRANCH_ID 
    GROUP BY
      BOOK.BOOK_ID,
      LIBRARY_BRANCH.BRANCH_ID,
      LIBRARY_BRANCH.BRANCH_NAME,
      BOOK_COPIES.NO_OF_COPIES,
      AUTHOR_NAME  
    
  • 最后的查询如下所示

    SELECT
        DISTINCT BOOK.BOOK_ID
    FROM
        BOOK INNER JOIN BOOK_AUTHORS USING(BOOK_ID)                                     
    WHERE
          BOOK.TITLE LIKE :title 
          OR BOOK.BOOK_ID = :book_id 
          OR BOOK_AUTHORS.AUTHOR_NAME LIKE :author_name
    
    SELECT
    TITLE,
    BOOK.BOOK_ID,
    LIBRARY_BRANCH.BRANCH_NAME,
    LIBRARY_BRANCH.BRANCH_ID,
    BOOK_COPIES.NO_OF_COPIES,
    COUNT(distinct BOOK_LOANS.BOOK_ID) AS NUM_OUT,
    BOOK_COPIES.NO_OF_COPIES - COUNT(distinct BOOK_LOANS.BOOK_ID) AS NUM_AVAIL,
    AUTHOR_NAME  
    
    FROM
      (
        SELECT
            DISTINCT BOOK.BOOK_ID
        FROM
            BOOK,
            BOOK_AUTHORS                                          
        WHERE
              BOOK.TITLE LIKE :title 
              OR BOOK.BOOK_ID = :book_id 
              OR BOOK_AUTHORS.AUTHOR_NAME LIKE :author_name
      ) AS A 
    INNER JOIN BOOK USING(BOOK_ID)
    INNER JOIN BOOK_AUTHORS USING (BOOK_ID)
    INNER JOIN BOOK_COPIES USING(BOOK_ID) 
    INNER JOIN LIBRARY_BRANCH USING(BRANCH_ID)
    LEFT OUTER JOIN
      BOOK_LOANS 
        ON BOOK.BOOK_ID=BOOK_LOANS.BOOK_ID 
        AND LIBRARY_BRANCH.BRANCH_ID=BOOK_LOANS.BRANCH_ID 
    GROUP BY
      BOOK.BOOK_ID,
      LIBRARY_BRANCH.BRANCH_ID,
      LIBRARY_BRANCH.BRANCH_NAME,
      BOOK_COPIES.NO_OF_COPIES,
      AUTHOR_NAME  
    

就模式而言,我认为应该有一个名为
authors\u master
的表,它有两列
author\u id,author\u name
,这样就可以使用一个表
book\u author
将其映射到book,该表只有两列
book\u id,author\u id
,这可能是一个解决方案,但这正是我要做的。更正了打字错误,但A.BRANCH\u ID=BOOK\u LOANS.BRANCH\u ID不起作用,因为A里面没有
BRANCH\u ID
。@user2961121抱歉。固定的。它是复制粘贴的。@user2961121“返回两行”无法消除。当一本书有3位作者时,选择“始终返回3行”。我想你需要做两个查询,一个是图书和贷款信息,一个是作者信息。哦,好的,我需要找到一种方法来清楚地显示它们。我成功了!但是你能解释一下你做了什么吗?太多了!