繁体   English   中英

LEFT JOIN-从左表中获取所有数据,而右表中没有匹配项

[英]LEFT JOIN - fetching all data from left table with no matches in the right one

在我的项目中,我有两个像这样的表:

parameters (
    id PRIMARY KEY,
    name
)

parameters_offeritems (
    id_offeritem,
    id_parameter,
    value,
    PRIMARY KEY (id_offeritem, id_parameter)
)

我没有显示offeritems表的结构,因为这不是必需的。

一些样本数据:

INSERT INTO parameters (id, name) VALUES
    (1, 'first parameter'), (2, 'second parameter'), (3, 'third parameter')

INSERT INTO parameters_offeritems (id_offeritem, id_parameter, value) VALUES
    (123, 1, 'something'), (123, 2, 'something else'), (321, 2, 'anything')

现在我的问题是-如何获取(针对给定的商品ID) 所有现有参数的列表,此外,如果对于给定的商品ID有一些参数集,我想在一个查询中获取它们的值。

到目前为止,我进行了如下查询:

SELECT p.*, p_o.value FROM parameters p LEFT JOIN parameters_offeritems p_o
ON p.id = p_o.id_parameter WHERE id_offeritem = OFFER_ID OR id_offeritem IS NULL

但是,它仅获取那些在parameters_offeritems表中没有现有记录的parameters_offeritems 仅为当前报价设置值的参数。

要获取所有参数以及为特定商品设置的任何参数的值,您需要将商品ID逻辑像这样移动到联接中(请参见下文)。

SELECT  p.*, p_o.value 

FROM    parameters p 

        LEFT JOIN parameters_offeritems p_o
        ON p.id = p_o.id_parameter 
        AND id_offeritem = OFFER_ID;

如果在WHERE子句中有逻辑要引用要在其上进行LEFT JOIN的表中的字段,则可以有效地将JOIN更改为INNER JOIN (除非您要检查NULL)。

您要找的魔术字是OUTER JOIN。 杰夫·阿特伍德(Jeff Atwood)在这里很好地解释维恩图。

您所查询的是近乎完美,只是WHERE在错误的步伐:

SELECT p.*, p_o.value FROM parameters p 
LEFT JOIN ( 
     SELECT * FROM parameters_offeritems 
     WHERE id_offeritem = OFFER_ID) as p_o
ON p.id = p_o.id_parameter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM