左连接不返回所有行

时间:2010-04-23 16:45:14

标签: mysql left-join

我在MySQL中有这个查询:

SELECT pr.*, pr7.value AS `room_price_high`
FROM `jos_hp_properties` pr
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id
WHERE pr7.field=23

jos_hp_properties表有27行,但查询只返回一行。基于 this question ,我认为可能是因为WHERE子句。 jos_hp_properties2表包含字段id,property,field,value,其中field是第三个表的外键(我不需要从中获取数据)。

有没有办法从第一个表中选择所有行,包括表#2中字段为23的值(如果没有字段23,则为NULL)?

4 个答案:

答案 0 :(得分:33)

不确定。将WHERE条件移动到JOIN:

SELECT pr.*, pr7.value AS `room_price_high`
  FROM `jos_hp_properties` pr
       LEFT JOIN `jos_hp_properties2` pr7 
       ON pr7.property=pr.id
   AND 
       pr7.field=23

答案 1 :(得分:6)

您必须将pr7条件放在连接中,而不是在where子句中。在执行连接之后,where子句对整个结果集起作用。

SELECT pr.*, pr7.value AS `room_price_high`
FROM `jos_hp_properties` pr
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id and pr7.field=23

答案 2 :(得分:0)

试试这个:

SELECT pr.*, pr7.value AS `room_price_high`
FROM `jos_hp_properties` pr
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id
WHERE (pr7.field=23 OR pr7.field is null)

答案 3 :(得分:0)

还可以使用CTE(公用表表达式)进行选择,然后使用CTE进行左联接。

wrc (parentid, childid) as (
    select parentid, childid
    from placechild
    where relationshipid in  (select id from placerelationship where relationship = 'Winter Region Capital')
),
stw (cnid, coid, capid, st_or_te, sid, scid,wcid) as (
    select s.cnid, s.coid, s.capid, s.st_or_te, s.sid, s.scid, w.childid
    from stcap s
    left join wrc w
    on s.sid = w.parentid
)
select * from stw