0

私は何時間もこのクエリでレンガの壁に頭をぶつけていて、ここで運がいいと思っていました。

カテゴリとカテゴリ評価に基づいて製品を返すクエリに取り組んでいます。

単純化されたスキーマは次のようになります。

商品
ID

価格

カテゴリ
ID

products_categories
product_id
category_id
評価 ( 0 - 5 )

私が現在持っているクエリは次のとおりです。

SELECT 
`products` . *, products_categories.*
FROM
`products`
    JOIN
`products_categories` ON (`products`.`id` = `products_categories`.`product_id`)
WHERE
`products_categories`.`category_id` IN ('5' , '24', '41')
    AND `products_categories`.`rating` > 1
    AND `products`.`enabled` = 1
HAVING count(distinct (products_categories.category_id)) = 3
ORDER BY `amount` ASC
LIMIT 9 OFFSET 0

クエリの最初の部分は、正常に機能する 3 つのカテゴリに属する​​すべての製品を選択することですが、私が苦労している部分は評価部分です。

カテゴリの評価が 1 以上の場合、これら 3 つのカテゴリに属する​​すべての製品を選択するクエリが必要です。現状では、クエリは、偽の結果を返す最後のカテゴリの評価に対してのみ動作します。

正しい方向への単なるポイントであっても、どんな入力でも大歓迎です。

乾杯。

4

1 に答える 1

1

すべてを一度にカウントするのではなく、製品ごとにカウントするGROUP BY句が必要です。COUNT()

SELECT 
`products` . *, products_categories.*
FROM
`products`
    JOIN
`products_categories` ON (`products`.`id` = `products_categories`.`product_id`)
WHERE
`products_categories`.`category_id` IN ('5' , '24', '41')
    AND `products_categories`.`rating` > 1
    AND `products`.`enabled` = 1
GROUP BY products.id
HAVING count(distinct (products_categories.category_id)) = 3
ORDER BY `amount` ASC
LIMIT 9 OFFSET 0
于 2013-11-11T21:49:59.497 に答える