【发布时间】:2012-12-14 18:33:27
【问题描述】:
让我先描述一些背景。我们有一个包含我们所有产品的表,一个包含“产品标签”列表(材料/尺寸/类型)的表,以及一个包含分配给产品的标签列表的表(“tag_id”= > 1 (材料), '价值' => '黄金', '产品' => 123)
我正在尝试使用与此类似的查询来过滤掉某些产品,但它似乎不起作用。任何人都可以提供一些正确方向的指示吗?
SELECT DISTINCT `products`.* FROM `products`,`product_assigned_tags`
LEFT JOIN `product_assigned_tags` AS tags_0 ON tags_0.`tag_id` = 1
LEFT JOIN `product_assigned_tags` AS tags_1 ON tags_1.`tag_id` = 2
WHERE (
((tags_0.`value` = 'silver' ) AND (tags_0.`value` != 'gold' ) ) AND
((tags_1.`value` = 'small' ) AND (tags_1.`value` != 'large' ) )
) AND (`products`.`type` = '2' OR `products`.`type` = '1' ) LIMIT 0, 30
【问题讨论】:
-
你有一个无效的隐式内连接和左连接组合。请发布您的表结构和您想要查询的数据样本,以帮助我们了解您的需求。
-
最好显示您的预期输出。 +1 @MichaelBerkowski
-
@Michael:实际上,OP 查询中没有任何真正的 LEFT 连接。 WHERE 子句中的谓词否定“左连接”的任何“外部”特性,使它们等同于“内连接”。而第一个连接实际上是一个交叉连接。