如何避免使用多个SQL调用来获取数据?

时间:2012-11-25 21:46:08

标签: sql join left-join

我有一个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]
  4. 我觉得3条SQL语句虽然很麻烦。关于如何使用单个SQL语句的任何想法?我只是在学习SQL,并且正在努力学习基础知识。谢谢!

1 个答案:

答案 0 :(得分:3)

由于某些猴子可能缺少香蕉,这意味着matchesmonkeys之间的a LEFT JOIN。这将确保列出所有猴子,即使它们在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

Here is an example on SQLfiddle.com

我强烈推荐阅读Jeff Atwood(Stack Overflow的联合创始人)excellent article explaining SQL joins