我有这个直截了当的查询:
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
然后我只得到那份报纸上的格式。我仍然需要所有格式,无论报纸是否有这种格式。
希望这是有道理的。如果需要,请要求澄清。
答案 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会更好。