在查询中保留不匹配的数据

时间:2014-09-18 20:19:52

标签: mysql sql performance

我有一个查询我正试图在两个表中运行。让我们简化并说它们是

表1

| Name    | Type |
+---------+------+
| Sam     | A    |
| Jane    | A    |
| Steve   | B    |

表2

| Name    | Value | Date |
+---------+-------+------+
| Sam     | 2     | 2014 |
| Jane    | 2     | 2013 |
| Sam     | 1     | 2013 |
| Steve   | 1     | 2013 |

我想列出一个A类型的人,很简单:

SELECT name FROM table1 WHERE type='A'

给出了

Sam
Jane

正如所料。我还想在Table2中包含他们最近的日期:

SELECT name, MAX(date)
FROM table1
LEFT JOIN table2 USING(name)
WHERE type='A'
GROUP BY name

给出了

Sam  2014
Jane 2013

但我不想在Table2中包含项目,除非它们的值为1:

SELECT name, MAX(date)
FROM table1
LEFT JOIN table2 USING(name)
WHERE type='A' && value = 1
GROUP BY name

给出了

Sam  2013

但在这里我想保留所有匹配的名称,如下:

Sam  2013
Jane NULL

我该怎么做?我应该提一下,所涉及的两个表都很大,即使输出不是(几百个),所以效率是一个问题,尽管不是一个大问题。

1 个答案:

答案 0 :(得分:2)

您需要将WHERE条件移至JOIN,因为将其置于WHERE条款中会否定OUTER JOIN

SELECT t.name, MAX(t2.date)
FROM table1 t
     LEFT JOIN table2 t2 on t.name = t2.name and t2.value = 1
WHERE t.type='A'
GROUP BY t.name