2012-02-18 18 views
2

本当に誰かが私を助けたり、少なくとも正しい方向に向けることを願っています。私は製品サイトの作業を行っています。訪問者は、www.asos.comのような製品結果の側面にあるメニューを使用して結果をフィルタリングできます。基本的に、彼らは製品タイプ、スタイル、価格、フィットなどを選択することができます。これらのフィットタイプのそれぞれは、独自のテーブルと、各値を製品テーブルにリンクする参照テーブルを持っています。 EGは、次のフィールド、Colour_ID、名前 のProductKeyとColourrefテーブルで、私はMySQLとPHPを使用していColour_IDテーブル内の同じフィールドの複数のクエリ

のProductKeyおよびその他のすべての製品情報 カラーテーブルと

製品のテーブルがあります。私はデータベースを照会し、訪問者が各フィルタータイプから1つの選択をしてから各属性の数を表示する方法を知っていますが、複数の選択をしてから計算することができるようにしたいと思います選択されたものに基づいて、各属性のカウント私はこれをどのように行うべきかを見てきましたが、サブクエリはオプションであることがわかりましたが、9つのフィルタグループがあるので、いくつのサブクエリを作成する必要があるかについて懸念しています。値。現在、データベースには製品数が1/200万であり、これは時間の経過と共に増加しています。私は、例えば

ページ= 1つの&図20 = &積= 125137147 &タイプ= 1,3,5 &色= 3,9,5として、URLを介して照会する必要がある値を捕捉してい&材質= 187,345

例からわかるように、私は毎回複数の値を持つことができます。私はANDを使って質問を書こうとしました。例:product = 125 AND product = 137ですが、これは機能しません。

誰かが正しい方向のポイントであっても、これを行う最善の方法についてアドバイスをしていますか?

すべてのヘルプは大歓迎されます

は事前に

ありがとうヴィヴィアン

答えて

2

は、基本的には、すでにあなた自身の質問に答え:

SELECT ... 
FROM ... 
WHERE (product = 125 OR product = 137) AND 
     (colour = 3 OR colour = 8 OR colour = 5) ... 

をあなたがOR代わりのANDを使用する必要がありますいくつかの製品、色などを選択したい場合。 商品と色の両方が必要な場合は、ANDを使って組み合わせる必要があります。ここでサブクエリは必要ありません。

SELECT ... 
FROM ... 
WHERE product IN (125, 137, 147) AND colour IN (3, 5, 8) 

このSQLコードのより完全な例:


これは、しかしINを使用する方が簡単です

SELECT p.* 
FROM Products p 

LEFT JOIN Colourref cr 
ON cr.productkey = p.productkey 

LEFT JOIN Colours c 
ON c.Colour_ID = cr.Colour_ID 

WHERE 
    p.productkey IN (1, 2, 4) 
    AND c.Colour_ID IN (1, 2) 

これはIDを持っているすべての製品を選択します1 、2または4の色1または2を有する。

これは、IDに必要なテーブルを結合した後、目的の値をフィルタリングします。

+0

こんにちはキリスト、私はすでに答えを知っていて、私の質問を削除しようとしていた。私はANDの代わりに何らかの理由でANDを使うことを考えていました。手伝ってくれてどうもありがとう。 – Amara

+0

あなたが気にしないなら、別の質問があります。私は、クエリでINを使用すると、MySQLはカラムに設定したインデックスを使用しないことに気付きました。これによりこれらのインデックスは冗長になりますが、削除する必要はありますか?ありがとうございました – Amara

+0

@ user1147635オプティマイザがインデックスを使用しないことを決定した場合、通常はフルテーブルスキャンが高速であるためです。すべてのID列に索引がありますか?テーブルの 'ANALYZE TABLE

'を実行して、やり直してください。インデックスを使用しないとどのように伝えますか?ただし、いずれにしてもそれらを取り外さないでください。それでも、他のクエリには役立つかもしれません。 – Chris

関連する問題