我需要了解如何做到这一点......
对于在整个图书馆系统(不仅仅是一个分支)中具有超过17份或少于5份副本的每本书,将“标题”和总份数显示为“total_copies”。
BOOK(book_id,title)
BOOK_COPIES(book_id,branch_id,no_of_copies)
LIBRARY_BRANCH(branch_id,branch_name,address)
我无法理解如何执行此操作,是否需要使用子查询或纯单行查询?
请帮助我理解...... !!
答案 0 :(得分:2)
SELECT BOOK.book_id, BOOK.title, SUM(no_of_copies)
FROM BOOK_COPIES
INNER JOIN BOOK ON BOOK_COPIES.book_id=BOOK.book_id
GROUP BY BOOK_COPIES.book_id
HAVING SUM(no_of_copies)<5 OR SUM(no_of_copies)>17
这就是它的作用
首先检查你的BOOK_COPIES
表并根据他们的书籍ID总结所有书籍的副本数量,然后它附加BOOK
表中的标题,然后最后检查这个数字副本小于5或大于17,然后它返回所有这些结果。
在这里阅读JOIN(s),它们非常有趣且有用。
答案 1 :(得分:0)
SQL JOIN应该在这里工作。 http://dev.mysql.com/doc/refman/5.0/en/join.html
SELECT
`BOOK`.`title`,
COUNT(`BOOK_COPIES`.`no_of_copies`) as `total_copies`
FROM `BOOK_COPIES`
JOIN `BOOK` ON (`BOOK_COPIES`.`book_id` = `BOOK`.`book_id`)
GROUP BY `BOOK_COPIES`.`book_id`
HAVING
`total_copies` > 17 AND
`total_copies` < 5
现在根据您提供的极少信息,这可能会也可能不会起作用,具体取决于BOOK_COPIES
和BOOK
表中的行数。以及如何设置索引;那就是你有任何索引。
如果运行速度非常慢,您可能希望将其分解为两个sql调用,如此。
SELECT
`book_id`,
COUNT(`no_of_copies`) as `total_copies`
FROM `BOOK_COPIES`
GROUP BY `book_id`
HAVING
`total_copies` > 17 AND
`total_copies` < 5
使用您熟悉的任何语言,并将书籍ID列表推送到第二个查询中。
SELECT
`book_id`,
`title`
FROM `BOOK`
WHERE `book_id` IN (/* List of book ids from first query */)
示例:
WHERE `book_id` IN (123, 345, 678, 901)