1

所以这里有三个关系:

表成员

成员(member_id、姓名、城市、州)

其中 member_id 是主键

借来的表

借(borrow_id,lib_id,member_id)

其中borrow_id 是主键

表库

库(lib_id、lib_address、lib_city、lib_state)

其中 lib_id 是主键

lib_id 和 member_id 都是外键

因此,我正在尝试编写一个查询,以查找在他们所在城市的每个图书馆借过书的成员的所有 member_id。这意味着

members.city = libraries.lib_city AND members.state = libraries.lib_state

我正在考虑使用关系除法。例如,您有一个由 member_id 和他们借书的所有 lib_id 组成的关系。然后您将其除以包含该成员所在城市中所有 lib_id 的关系。

但是,我对如何用关系代数术语来写这个感到困惑。

在 mysql/sql 中这很容易,但转换为关系代数是我卡住的地方。

4

1 回答 1

0

一种策略是将COUNT(DISTINCT lib_id)每个城市member_id的总数与COUNT(DISTINCT lib_id)每个城市的总数相匹配。如果两者相等,则个人已从他所在城市的每个图书馆借阅。

认为以下将完成这项工作:

SELECT 
  member_id, 
  /* Total libraries borrowed from by member */
  COUNT(DISTINCT Borrowed.lib_id) AS num_libs_borrowed,
  /* Total libs in the member's city */
  COUNT(DISTINCT Libraries.lib_id) AS total_city_libs
FROM 
  Members
  /* JOIN the city between Members & Libraries */
  JOIN Libraries ON Members.city = Libraries.lib_city
  /* JOIN member to borrowed */
  JOIN Borrowed ON Members.member_id = Borrowed.member_id
GROUP BY member_id 
/* If the number of libs borrowed from = the total libs in the city... */
HAVING num_libs_borrowed = total_city_libs
于 2012-11-07T04:59:48.427 回答