mysql - 无法正确连接 3 个表

标签 mysql relational-algebra natural-join

在了解自然连接时,我遇到了查询:

Find the names of branches with customers who have an account in the bank and live in Harrison

书上的关系代数表达式如下:

enter image description here

用查询实现相同的:

select distinct a.branch_name from depositor d, account a, customer where d.account_number=a.account_number and customer.customer_city='Harrison'; 

我得到的伪元组如下:

+-------------+
| branch_name |
+-------------+
| Perryridge  |
| Downtown    |
| Brighton    |
| Redwood     |
| Mianus      |
| Round Hill  |
+-------------+
6 rows in set (0.00 sec)

但查询必须根据如下模式仅返回 Brighton 和 Perryridge:

mysql> select * from account;
+----------------+-------------+---------+
| account_number | branch_name | balance |
+----------------+-------------+---------+
| A101           | Downtown    |     500 |
| A102           | Perryridge  |     400 |
| A201           | Brighton    |     900 |
| A215           | Mianus      |     700 |
| A217           | Brighton    |     750 |
| A222           | Redwood     |     700 |
| A305           | Round Hill  |     350 |
+----------------+-------------+---------+
7 rows in set (0.00 sec)

mysql> select * from customer;
+---------------+-----------------+---------------+
| customer_name | customer_street | customer_city |
+---------------+-----------------+---------------+
| Adams         | Spring          | Pittsfield    |
| Brooks        | Senator         | Brooklyn      |
| Curry         | North           | Rye           |
| Glenn         | Sand Hill       | Woodside      |
| Green         | Walnut          | Stamford      |
| Hayes         | Main            | Harrison      |
| Johnson       | Alma            | Palo Alto     |
| Jones         | Main            | Harrison      |
| Lindsay       | Park            | Pittsfield    |
| Smith         | North           | Rye           |
| Turner        | Putnam          | Stamford      |
| Williams      | Nassau          | Princeton     |
+---------------+-----------------+---------------+
12 rows in set (0.00 sec)

mysql> select * from depositor;
+---------------+----------------+
| customer_name | account_number |
+---------------+----------------+
| Hayes         | A102           |
| Johnson       | A101           |
| Johnson       | A201           |
| Jones         | A217           |
| Lindsay       | A222           |
| Smith         | A215           |
| Turner        | A305           |
+---------------+----------------+
7 rows in set (0.00 sec)

我哪里出错了?

最佳答案

您可能会忘记存款人和客户之间的联系。

depositor.customer_name = customer.customer_name

所以整个查询应该是:

SELECT DISTINCT a.branch_name  
FROM depositor d, account a, customer  
WHERE d.account_number = a.account_number  
AND d.customer_name = customer.customer_name  
AND customer.customer_city='Harrison'

结果:

+-------------+
| branch_name |
+-------------+
| Perryridge  |
| Brighton    |
+-------------+
2 rows in set (0.00 sec)

关于mysql - 无法正确连接 3 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30962746/

相关文章:

php - 连接同一服务器上的两个相似数据库

database - 关系代数而不是 SQL

SQL:如何使用约束强制执行函数依赖?

mysql - 嵌套查询帮助

mysql - 如果我自然加入这两个表会发生什么?

mysql - mysql中自然连接和左连接在一起

mysql - 一张表两个字段的内连接

python - Django MySQL 与 iRegex 搜索精确词匹配

php - 带过滤器的排名系统

database - 我的关系代数正确吗?