LEFT JOIN - 从左侧 table 获取所有数据,右侧没有匹配项

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

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

parameters (
    id PRIMARY KEY,
    name
)

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

我没有显示 offeritems table 的结构,因为没有必要。

一些示例数据:

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 table、 参数中没有现有记录,仅为其设置值当前报价。

您正在寻找的魔法词是 OUTER JOIN。 Jeff Atwood 做了一个很好的维恩图解释 here

要获取所有参数,加上为特定商品设置的任何参数值,您需要像这样将商品 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 子句中有引用 table 中的字段的逻辑,您正在执行 LEFT JOIN,您实际上将 JOIN 更改为 INNER JOIN(除非您正在检查 NULL)。

您的查询几乎是完美的,只是 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