在我的项目中,我有两个这样的表:
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
表,或参数中没有现有记录,其值仅为当前要约设置。
答案 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