快速左连接问题

时间:2009-12-02 19:04:42

标签: sql mysql

我有这个直截了当的查询:

SELECT f.id, f.format_type, h.newspaper_id
FROM newspapers_formats f
LEFT JOIN newspapers_formats_held h
ON (f.id = h.format_id)

这将返回所有format_types,格式ID以及我们对该格式的报道ID。我需要的是然后将它限制为只有newspaper_id = x,但是,如果我用WHERE这样做,就像这样:

SELECT f.id, f.format_type, h.newspaper_id
FROM newspapers_formats f
LEFT JOIN newspapers_formats_held h
ON (f.id = h.format_id)
WHERE h.newspaper_id=3

然后我只得到那份报纸上的格式。我仍然需要所有格式,无论报纸是否有这种格式。

希望这是有道理的。如果需要,请要求澄清。

5 个答案:

答案 0 :(得分:4)

您可以将查询更改为

SELECT f.id, f.format_type, h.newspaper_id
    FROM newspapers_formats f
    LEFT JOIN newspapers_formats_held h
    ON (f.id = h.format_id)
    AND h.newspaper_id=3

答案 1 :(得分:4)

这是ON子句与where子句中条件之间查询行为差异的一个很好的例子。对于WHERE子句,返回的记录必须匹配。这排除了不匹配newspaper_formats的行,因为这些行的报道ID为NULL,并且为NULL!= 3。

Format_type  newspaper_id   
1            NULL           Exclude because null != 3
1            3              Include because 3=3
1            2              Exclude because 2 !=3

要包含所有格式类型,您希望将该条件置于连接条件中。左外连接的标准定义:“从连接左侧的表中检索所有记录,只检索与连接右侧表中的连接条件匹配的记录。”连接标准必须为ON,而不是WHERE。

SELECT f.id, f.format_type, h.newspaper_id
FROM newspapers_formats f
LEFT JOIN newspapers_formats_held h
ON (f.id = h.format_id AND h.newspaper_id=3)

答案 2 :(得分:2)

SELECT f.id, f.format_type, h.newspaper_id
    FROM newspapers_formats f
        LEFT JOIN newspapers_formats_held h ON (f.id = h.format_id)
    WHERE h.newspaper_id = 3
        OR h.format_id IS NULL

答案 3 :(得分:1)

您需要将过滤条件放在ON子句中。像这样:

SELECT f.id,f.format_type,h.newspaper_id 来自newspaper_formats f   LEFT JOIN newspaper_formats_held h     ON(f.id = h.format_id)     并且h.newspaper_id = 3

答案 4 :(得分:0)

Dewayne的答案很棒。

也许使用distinct会更好。