给定以下(非常简化的)mysql表结构:
产品
- ID
产品类别
- ID
- product_id
- 状态(整数)
产品标签
- ID
- product_id
- some_other_numeric_value
我试图找到与某个 product_tag 相关联的每个产品,并且与至少一个 status-attribute 为 1 的类别相关联。
我尝试了以下查询:
SELECT *
FROM `product` p
JOIN `product_categories` pc
ON p.`product_id` = pc.`product_id`
JOIN `product_tags` pt
ON p.`product_id` = pt.`product_id`
WHERE pt.`some_value` = 'some comparison value'
GROUP BY p.`product_id`
HAVING SUM( pc.`status` ) > 0
ORDER BY SUM( pt.`some_other_numeric_value` ) DESC
现在我的问题是:SUM(pt.some_other_numeric_value)
返回意外的值。
我意识到,如果有问题的产品与 product_categories 表的关系不止一个,那么与product_tags表的每个关系都被计算为与product_categories表的关系一样多的时间!
例如:如果 id=1 的产品与 ids = 2、3 和 4 的 product_categories 有关系,并且与 id 为 5 和 6 的 product_tags 有关系 - 那么如果我插入 a GROUP_CONCAT(pt.id)
,那么它会给出5,6,5 ,6,5,6而不是预期的5,6。
起初我怀疑是连接类型(左连接、右连接、内连接等)有问题,所以我尝试了所有我知道的连接类型,但无济于事。我还尝试在GROUP BY
子句中包含更多的 id 字段,但这也没有解决问题。
有人可以向我解释这里到底出了什么问题吗?