2

mySQL 5.xがINTERSECTをサポートしていないことは知っていますが、それが必要なようです。

表A:製品(p_id)

表B:Prod_cats(cat_id)-カテゴリ情報(名前、説明など)

表C:prod_2cats(p_id、cat_id)-多対多

prod_2catsは、製品(A)に割り当てられた多くの(1つ以上の)カテゴリを保持します。

クエリ/フィルタールックアップを実行し(ユーザーインタラクティブ)、すべての基準を満たす製品を複数のカテゴリから選択できる必要があります。

例:-カテゴリXに割り当てられた80個の製品-カテゴリYに割り当てられた50個の製品-ただし、猫Xと猫Yの両方に割り当てられた製品(交差)は10個のみです。

このSQLは、次の1つのカテゴリで機能します。

SELECT * FROM products WHERE p_show ='Y' AND p_id IN(SELECT p_id FROM prods_2catsAS PC WHEREPC.cat_id="。$cat_id。"

<-$ cat_idは、クエリフォームから渡されたサニタイズされた変数です。

「猫Aと猫Bの交差点を教えて」と言ってサブセットを取り戻す手段が見つからないようです(私の例では10レコード)

ヘルプ!

4

3 に答える 3

2

うーん、それが最善の方法かどうかはわかりませんが、既存のクエリに簡単に追加できます。

SELECT *
FROM products
WHERE p_show='Y'
    AND p_id IN (SELECT p_id
                 FROM prods_2cats AS PC
                 WHERE PC.cat_id = $cat1_id)
    AND p_id IN (SELECT p_id
                 FROM prods_2cats AS PC2
                 WHERE PC2.cat_id = $cat2_id)
于 2010-04-05T20:58:55.507 に答える
1

集合論からの共通部分の定義を適用します。したがって、XがYと交差すると集合Zが得られる場合、Zの各xについて、xはXにあり、xはYにあると見なされます。

何かのようなもの

SELECT * FROM products WHERE p_show='Y' AND p_id IN 
( SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =X) AND p_id IN
( SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =Y)
于 2010-04-05T20:59:06.037 に答える
1
SELECT *
FROM products
WHERE p_show='Y'
    AND p_id IN (SELECT p_id
                 FROM prods_2cats AS PC
                 WHERE PC.cat_id in ($cat1_id, $cat2_id ))

またはさらに良い

SELECT p.*
FROM products p INNER JOIN prods_2cats AS PC on p.p_id = PC.p_id
WHERE p_show='Y' and C.cat_id in ($cat1_id, $cat2_id )

お役に立てれば

于 2010-04-06T21:13:27.840 に答える