我有两个表。一个带有产品,另一个带有产品元数据。
我的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'
而不是关键字或文件名。
将过滤条件移至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';