次の (非常に単純化された) mysql テーブル構造があるとします。
製品
- ID
製品カテゴリ
- ID
- 製品番号
- 状態 (整数)
商品タグ
- ID
- 製品番号
- some_other_numeric_value
特定のproduct_tagに関連付けられており、ステータス属性が1である少なくとも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 との関係があり、ids 5 と 6 の product_tags との関係がある場合、a を挿入するGROUP_CONCAT(pt.id)
と、5,6,5になります。 ,6,5,6ではなく、予想される5,6。
最初は、結合タイプ (左結合、右結合、内部結合など) に問題があるのではないかと疑ったので、知っているすべての結合タイプを試しましたが、役に立ちませんでした。また、句にさらに id フィールドをGROUP BY
含めようとしましたが、これでも問題は解決しませんでした。
誰かがここで実際に何がうまくいかないのか説明できますか?