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

标签 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 表中没有现有记录的参数,或者参数,仅针对当前报价设置了值。

最佳答案

要获取所有参数以及为特定优惠项目设置的任何参数的值,您需要将优惠 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 的表中的字段,则您可以有效地更改您的 JOININNER JOIN(除非您要检查 NULL)。

关于mysql - LEFT JOIN - 从左表中获取所有数据,右表中没有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28258393/

相关文章:

商店搜索中的 SQL 注入(inject)模式

mysql:如何删除然后插入某种类型的所有记录?

MYSQL 预定事件

java - 我正在尝试将 ArrayList 对象存储在数据库中

具有多个连接、计数和左连接的 SQL 到 LINQ

tsql - 我们如何使用旧语法进行 LEFT JOIN?

MySql LEFT JOIN 与 COUNT

mysql - 员工培训分析查询的条件查询

java - JDBCPreparedStatement 似乎忽略占位符

c# - SQL记录条目,不同的测试用例