我有一个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语句,它们起作用:
SELECT * FROM matches
SELECT * FROM monkeys WHERE id=[monkey_id from 1st SQL query]
SELECT * FROM bananas WHERE id=[banana_id from 1st SQL query]
我觉得3条SQL语句虽然很麻烦。关于如何使用单个SQL语句的任何想法?我只是在学习SQL,并且正在努力学习基础知识。谢谢!
答案 0 :(得分:3)
由于某些猴子可能缺少香蕉,这意味着matches
和monkeys
之间的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。