新手到mysql,无法理解

时间:2013-11-18 07:11:40

标签: mysql select join

我需要了解如何做到这一点......

对于在整个图书馆系统(不仅仅是一个分支)中具有超过17份或少于5份副本的每本书,将“标题”和总份数显示为“total_copies”。

  

BOOK(book_id,title)
  BOOK_COPIES(book_id,branch_id,no_of_copies)
  LIBRARY_BRANCH(branch_id,branch_name,address)

我无法理解如何执行此操作,是否需要使用子查询或纯单行查询?

请帮助我理解...... !!

2 个答案:

答案 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_COPIESBOOK表中的行数。以及如何设置索引;那就是你有任何索引。

如果运行速度非常慢,您可能希望将其分解为两个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)