0

HTML、PHP、js、および MySQL で Web サイトを開発しています。このウェブサイトでは、顧客は私が働いている会社が販売している製品をナビゲートすることができます. いくつかの異なる製品を扱っているため、結果をフィルタリングする機能を顧客に提供する必要があります (eBay の Web サイトを想像してください)。

Web サイトは順調ですが、私は Web サイト開発の経験があまりないため、フィルターの処理に苦労しています。問題は、ユーザーが使用するフィルターの数に応じて、異なる数の引数を渡す必要があることを考慮して、引数を php ページに渡す必要があります。

値をフィルター処理する例として、次の SQL ステートメントを検討してください。

 SELECT p.code, 
        p.price,
        p.description  
 FROM products p  
 INNER JOIN products_filtervalues pf1  
            ON pf1.productcode = p.code 
            AND pf1.idfilter=1 
            AND pf1.idfiltervalue=45  
 INNER JOIN products_filtervalues pf2  
            ON pf2.productcode = p.code 
            AND pf2.idfilter=2 
            AND pf2.idfiltervalue=6  
 INNER JOIN products_filtervalues pf3  
            ON pf3.productcode = p.code 
            AND pf3.idfilter=4 
            AND pf3.idfiltervalue=7  
 INNER JOIN filtervalues f  
            ON p.idcategory=1 
            AND p.idsubcategory=3 
            AND pf1.idfiltervalue=f.idfiltervalue 
            AND pf1.idfilter=f.idfilter  
 LIMIT 0, 15  

正常に動作しますが、これを動的に機能させるには、選択したフィルター値の数によって内部結合の数が異なるため、複数の「内部結合」行を挿入できる必要があります。

これまでのところ、Web サイトは順調に機能しており、jquery を使用した PHP と HTML 間のすべての通信はうまく機能しています。したがって、問題はコミュニケーションや既存のエラーではなく、この状況を解決する方法を知る必要があるだけです。

もっと良い解決策があるかもしれませんが、今はわかりません。誰か助けてくれませんか?

4

1 に答える 1

0

eav モデルを使用する必要がある場合、1 つの解決策は、疑似正規化 (および仮想) ピボット テーブルを作成し、それに対して次のようにクエリを実行することです。

 SELECT * FROM eav_hell;
 +-------+-----------+--------+
 | Owner | Attribute | value  |
 +-------+-----------+--------+
 |    10 | COLOR     | BLUE   |
 |    10 | COLOR     | GREEN  |
 |    10 | COLOR     | RED    |
 |    10 | SIZE      | BIG    |
 |    20 | COLOR     | GREEN  |
 |    20 | MEMORY    | 16G    |
 |    20 | MEMORY    | 32G    |
 |    20 | SIZE      | MEDIUM |
 |    30 | COLOR     | BLUE   |
 |    30 | COLOR     | RED    |
 |    30 | MEMORY    | 64G    |
 +-------+-----------+--------+

 SELECT * 
   FROM
      (
        SELECT owner
             , MAX(CASE WHEN attribute = 'color' THEN value END) color
             , MAX(CASE WHEN attribute = 'size' THEN value END) size
             , MAX(CASE WHEN attribute = 'memory' THEN value END) memory
          FROM eav_hell
  GROUP
            BY owner,attribute
      ) x
  WHERE color IN ('blue','green')
     OR size  IN ('small','medium');
 +-------+-------+--------+--------+
 | owner | color | size   | memory |
 +-------+-------+--------+--------+
 |    20 | GREEN | NULL   | NULL   |
 |    20 | NULL  | MEDIUM | NULL   |
 +-------+-------+--------+--------+

 Another solution, more of a quick and dirty hack, is as follows:

 SELECT *
   FROM eav_hell
  GROUP
     BY owner,attribute,value
 HAVING GROUP_CONCAT(CONCAT_WS(',',attribute,value)) IN ('color,blue','size,big')
 ;
 +-------+-----------+-------+
 | Owner | Attribute | value |
 +-------+-----------+-------+
 |    10 | COLOR     | BLUE  |
 |    10 | SIZE      | BIG   |
 |    30 | COLOR     | BLUE  |
 +-------+-----------+-------+
于 2013-01-29T13:23:31.080 に答える