SQL-仅当行类型为'privacy'时才可以检查行值是否为'public'吗?

问题描述 投票:0回答:1

我有两个表。一个带有产品,另一个带有产品元数据。

我的SQL字符串:SELECT * FROM `Products` LEFT JOIN `ProductsMeta` ON `ProductsMeta`.`product_id` = `Products`.`product_id` WHERE `ProductsMeta`.`meta_value` = 'public' OR `ProductsMeta`.`meta_value` IS NULL

但是问题不是每个产品都需要一个隐私元数据行,因此我会检查其是否为NULL,但是如果产品中的产品元数据中包含与隐私设置无关的其他内容,则它不会显示在选择查询中。

因此我尝试:SELECT * FROM `Products` LEFT JOIN `ProductsMeta` ON `ProductsMeta`.`product_id` = `Products`.`product_id` WHERE (`ProductsMeta`.`meta_value` = 'public' OR `ProductsMeta`.`meta_value` IS NULL) AND `ProductsMeta`.`meta_type` = '_privacy'

但是返回0个结果。因为只有一种产品具有带有_privacy的元条目,并且将其设置为未列出。

是否可以只检查`ProductsMeta`.`meta_value` = 'public' OR `ProductsMeta`.`meta_value` IS NULL,如果`ProductsMeta`.`meta_type` = '_privacy'而不是关键字或文件名。

sql
1个回答
0
投票

将过滤条件移至ON子句。我认为这就是您想要的:

SELECT *
FROM Products p LEFT JOIN
     ProductsMeta pm
     ON pm.product_id = p.product_id AND
        pm.meta_value = 'public' AND
        pm.meta_type = '_privacy';
© www.soinside.com 2019 - 2024. All rights reserved.