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)
。如果查询除了计数之外运行良好,DISTINCT将非常有用COUNT(BOOK\u LOANS.BOOK\u ID)
- 业绩很重要。我想内联视图太复杂了。我不知道是否有这样的变化
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行”。我想你需要做两个查询,一个是图书和贷款信息,一个是作者信息。哦,好的,我需要找到一种方法来清楚地显示它们。我成功了!但是你能解释一下你做了什么吗?太多了!