![](/img/trans.png)
[英]In Left Join of two table select all records from left table and select only one row record from right table that matches to left table
[英]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)。
您所查询的是近乎完美,只是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.