查询不返回表中另一个[associative]表中没有对应值的行

时间:2010-03-17 21:35:08

标签: sql mysql

我有

表:文章

ID | CONTENT
---------------
1  | the quick
2  | brown fox
3  | jumps over
4  | the lazy

表: WRITERS

ID | NAME
----------
1  | paul
2  | mike
3  | andy

表: ARTICLES_TO_WRITERS

ARTICLE_ID | WRITER_ID
-----------------------
1          | 1
2          | 2
3          | 3

总结一下,第4条没有作家

所以当我为文章“搜索”时使用“the”这个词:

SELECT a.id, a.content, w.name 
FROM articles a, writers w, articles_to_writers atw 
WHERE a.id=atw.article_id AND w.id=atw.writer_id AND content LIKE '%the%'

第4条未在结果中显示

ID | CONTENT   | NAME
-----------------------
1  | the quick | paul

即使没有作家,如何使第4条仍然出现在结果中?

3 个答案:

答案 0 :(得分:5)

尝试以下查询:

SELECT a.id, a.content, w.name 
FROM articles a LEFT JOIN articles_to_writers atw ON a.id = atw.article_id  
  LEFT JOIN writers w ON w.id=atw.writer_id
WHERE a.content LIKE '%the%'

您的原始查询使用较旧的SQL语法在所有表之间创建隐式INNER连接。 INNER联接需要在每个连接的表中匹配记录。

在上面的修订查询中,使用LEFT OUTER连接“附加”表。这将允许连接左侧的记录显示在最终结果集中,即使编写器中没有匹配的行也是如此。来自writer的列将具有这些“额外”行的NULL值。

答案 1 :(得分:2)

SELECT A.ID, A.CONTENT, W.NAME
FROM 
    ARTICLES A
    LEFT JOIN ARTICLES_TO_WRITERS ATW ON ATW.ARTICLE_ID = A.ID 
    LEFT JOIN WRITERS W ON W.ID = ATW.WRITER_ID
WHERE A.CONTENT LIKE '%the%'

答案 2 :(得分:1)

ANSI格式:

SELECT a.id, a.content, w.name
FROM articles a
LEFT JOIN articles_to_writers atw on a.id=atw.article_id
LEFT JOIN writers w on w.id=atw.writer_id
WHERE
acontent LIKE '%the%'

这是一个左连接,这意味着即使没有作家,也会显示所有文章。