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
在我的项目中,我有两个这样的 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