1

この MySQL クエリを実現するための最良の方法に行き詰まっています。

私は3つのテーブルを持っています:

products - これは製品のリストです

id | product_name

- これはカテゴリのリストです

id | category_name

cat_selected - 複数のカテゴリを製品に割り当てることができます。この表にはそれらがリストされています

cat_id | product_id

検索では、ユーザーは一度に検索する複数のカテゴリを選択できます。商品が各カテゴリに存在することを確認したいので、cat_id と product_id が一致している必要があります。猫の ID は配列として投稿されます。

このデータを照会する最良の方法は何ですか?

たとえば、以下は明らかな理由で機能しません。

SELECT *
FROM products
JOIN cats_selected
ON cats_selected.product_id = products.id
AND cats_selected.cat_id = '16372' 
AND cats_selected.cat_id = '9'
4

3 に答える 3

2
SELECT p.id
FROM products p
JOIN cats_selected s ON s.product_id = p.id
where s.cat_id in (16372, 9)
group by p.id
having count(distinct s.cat_id) = 2
于 2013-09-24T14:46:01.060 に答える
0

cat_id の配列が[1,2,4,3,52]IN 関数を使用できるように見えると仮定すると、WHERE 部分で cat_selected.cat_id をチェックする必要があります。

$cat_ids = [1,2,4,3,52];
$catImplode = implode(",",$cat_ids);

$query = <<<END
   SELECT products.*, GROUP_CONCAT(cats_selected.cat_id) as cats
   FROM products
   JOIN cats_selected
   ON cats_selected.product_id = products.id
   WHERE cats_selected.cat_id IN ($catImplode)
   GROUP BY products.id
END;

$query は次のようになります。

SELECT products.*, GROUP_CONCAT(cats_selected.cat_id) as cats
FROM products
JOIN cats_selected
ON cats_selected.product_id = products.id
WHERE cats_selected.cat_id IN (1,2,4,3,52)
GROUP BY products.id

cats製品に一致するカテゴリを知る必要がある場合に備えて、エイリアス化された GROUP_CONCAT 列を追加しました

于 2013-09-24T14:49:09.963 に答える
0

これは機能しますか?クエリ構文が正しくありません。

SELECT *
FROM products
JOIN cats_selected
ON cats_selected.product_id = products.id
WHERE cats_selected.cat_id IN ('16372', '9')
于 2013-09-24T14:45:27.617 に答える