1

私は。。をしようとしています :

  • 場所の選択に基づいて製品を表示する
  • 製品をループし、列名 = 1 (true) を返します。
  • 製品の機能を表すこれらの列名を含む製品フィルター ドロップダウンを作成します。

現時点では、フィルター ドロップダウンにはデフォルトですべての列が含まれていますが、一部のシナリオ (選択した場所に基づく) ではこれで問題ありませんが、場所に 20 個の製品のうち 2 個しかない場合、フィルターに表示するのは面倒です。無関係で結果を返さないドロップダウン機能...

これは、私が言おうとしていることの簡単な例です。

データベース テーブルの構造

+------+------------+-------------+----------------+-------------+-------------+ | SKU | HDMI | 3D | Android | Ethernet | location | +------+------------+-------------+----------------+-------------+-------------+ |TV1X | 0 | 0 | 0 | 0 |all | |TV5X | 0 | 0 | 0 | 0 |fr uk usa | |TV3Z | 1 | 0 | 0 | 1 |usa | |TVH3 | 1 | 1 | 1 | 1 |mex | |TVH1 | 1 | 1 | 1 | 1 |fr es uk | +------+------------+-------------+----------------+-------------+-------------+

機能列のタイプbit

製品表示

まあ言ってみれば$location = "%".'usa'."%"

$queryString = "SELECT * FROM `products` WHERE `location` LIKE :location" ;
$statement = $dbh->prepare($queryString)
$statement->bindParam(':location',  $location, PDO::PARAM_STR);
$statement->execute();
$statement->setFetchMode(PDO::FETCH_ASSOC);
$result = $statement->fetchAll();

上記のクエリは、米国に関連するTV5X&TV3Zを返します。「TRUE」であるこれらの製品機能はHDMI+Ethernetであり、フィルター ドロップダウンに表示したくない残りの 2 つの列のみです。この例は、多くの製品/機能と場所がある場合に、より適切になる可能性があります...

デフォルトのフィルタ リスト

<li >
  <button  data-filter=".HDMI" >HDMI</button>
</li>
<li >
  <button  data-filter=".3D" >3D</button>
</li>
<li >
  <button  data-filter=".Android" >Android OS</button>
</li>
<li >
  <button  data-filter=".Ethernet" >Ethernet</button>
</li>

デフォルトのフィルタ リストは一部の国に関連していますが、米国には関連していません

動的フィルター リスト

取得した製品 (この場合は 2 つ) に基づいて、データベースにクエリを実行し、これらの製品のどの列の値が TRUE であるかを見つけます。

<?php  foreach( $feature as $feat) : ?>

 <li >
    <button  data-filter=".<?php print  //Col_Name   ;?>" ><?php print  ect..    ;?></button>
 </li>

<?php endforeach;  ?>

長い投稿で申し訳ありませんが、できる限り最善の方法で説明しようとしています。

私の質問は、この目的のためにどのようにクエリを作成するのですか?

4

1 に答える 1

1

各列の合計を選択し、返された値が > 0 であることを確認することにより、1 つの追加クエリでこれを行うことができます。

SELECT SUM(`HDMI`) AS `HDMI`,
       SUM(`3D`) AS `3D`,
       SUM(`Android`) AS `Android`,
       SUM(`Ethernet`) AS `Ethernet`
FROM `products`
WHERE `location` LIKE :location

最初のクエリの後にこのクエリを実行すると、フィルター リストを出力するコードは次のようになります。

foreach ($result as $row) {
    foreach ($row as $column => $numProducts) {
        if ($numProducts > 0) { // i.e., SUM($column) is > 0
            $html .= "<li>
                <button data-filter=\".{$column}\">{$column} ({$numProducts})</button>
            </li>";
        }
    }
}

これには、各機能を備えた製品の数を提供するという追加のボーナスもあります. :)

于 2014-03-13T20:43:05.577 に答える