1

我有一个 MySQL 数据库,其中有一个表monkeys

id     name
1      Alice
2      Bill
3      Donkey Kong
4      Edna
5      Feefee

我还有一张桌子bananas,它们是从哪里挑选出来的。

id     where_from
1      USA
2      Botswana
3      Banana-land
4      USA

最后,我有一张表格matches,描述了哪些香蕉属于哪些猴子。每只猴子只能吃一根香蕉,没有一只猴子可以共用一根香蕉。有些猴子可能缺少一根香蕉。

id     monkey_id     banana_id
1      3             4 
2      4             1
3      5             2

如何使用单个 SQL 语句检索所有匹配项?对于每场比赛,我想要猴子的名字以及香蕉的来源。

我尝试了以下 3 个 SQL 语句,它们都有效:

  1. SELECT * FROM matches
  2. SELECT * FROM monkeys WHERE id=[monkey_id from 1st SQL query]
  3. SELECT * FROM bananas WHERE id=[banana_id from 1st SQL query]

我觉得 3 SQL 语句虽然很麻烦。关于如何只使用单个 SQL 语句的任何想法?我只是在学习 SQL,并且正在学习基础知识。谢谢!

4

1 回答 1

3

由于有些猴子可能缺少香蕉,这意味着介于LEFT JOINmatches之间monkeys。这将确保列出所有猴子,即使它们没有香蕉matches

SELECT
  monkeys.name,
  bananas.where_from
FROM
  monkeys
  /* List all monkeys, even if they have no match */
  LEFT JOIN matches ON monkeys.id = matches.monkey_id
  /* And another LEFT JOIN to link matches to bananas */
  LEFT JOIN bananas ON bananas.id = matches.banana_id

这是 SQLfiddle.com 上的一个示例

我强烈推荐阅读 Jeff Atwood(Stack Overflow 的联合创始人)解释 SQL 连接的优秀文章

于 2012-11-25T21:52:03.297 回答