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

时间:2015-02-01 01:09:35

标签: mysql sql left-join

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

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表,参数中没有现有记录,其值仅为当前要约设置。

3 个答案:

答案 0 :(得分:1)

要获取所有参数以及为特定商品项设置的任何参数的值,您需要将商品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)。

答案 1 :(得分:0)

你正在寻找的神奇词汇是OUTER JOIN。杰夫阿特伍德做了一个很好的维恩图解释here

答案 2 :(得分:0)

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