mysql基于两个表之间的公共列获取表

时间:2012-09-02 21:32:57

标签: mysql sql

在尝试学习sql的过程中遇到了“学习SQL困难之路”,我开始阅读它。 一切都很好,然后我想,作为练习的方式,在书中做出类似给定的例子(例子包括3个表pet,person,person_pet和person_pet表'将'宠物链接到他们的主人)。

我做到了:

report table
+----+-------------+
| id | content     |
+----+-------------+
|  1 | bank robbery|
|  2 | invalid     |
|  3 | cat on tree |
+----+-------------+
notes table
+-----------+--------------------+
| report_id | content            |
+-----------+--------------------+
|  1        | they had guns      |
|  3        | cat was saved      |
+-----------+--------------------+

wanted result
+-----------+--------------------+---------------+
| report_id | report_content     | report_notes  |
+-----------+--------------------+---------------+
|  1        | bank robbery       | they had guns |
|  2        | invalid            | null or ''    |
|  3        | cat on tree        | cat was saved |
+-----------+--------------------+---------------+

我尝试了几种组合但没有成功。

我的第一个想法是

SELECT report.id,report.content AS report_content,note.content AS note_content
FROM report,note
WHERE report.id = note.report_id

但这仅返回匹配的(不会返回无效报告)。 在此之后我尝试添加IF条件,但我只是让它变得更糟。

我的问题是,这是我在过去基本的SQL后会弄清楚的 或者这可以用简单的方式完成吗?

无论如何,我会感激任何帮助,我几乎失去了这个。

谢谢。

编辑:我已经调查过相关问题,但还没有找到解决我问题的问题。 我可能需要查看其他语句,例如join或者其他东西来解决这个问题。

2 个答案:

答案 0 :(得分:5)

您需要访问OUTER JOINS上的章节,特别是LEFT JOIN

SELECT report.id,report.content AS report_content,note.content AS note_content 
FROM report
    LEFT JOIN note ON report.id = note.report_id 

请注意ANSI-92 JOIN语法,而不是使用WHERE x=y

(你可以使用你使用WHERE report.id *= note.report_id的旧语法来实现它,如果我正确地回忆旧语法,但我建议使用上面的语法)

答案 1 :(得分:2)

你正在加入。您拥有的连接类型是内部联接,但您需要外部联接:

SELECT report.id,report.content AS report_content,note.content AS note_content
FROM report
LEFT JOIN note on report.id = note.report_id

请注意,LEFT表是提供缺失值的表。