1

すべての情報categoryを格納するテーブル[ and both] 、とを格納するテーブル、 との間の関係を格納するテーブルがあります。categoryparentchildcategory_childparentchild category relationproduct_categorychild_categoryproduct

  1. category- すべてのカテゴリ { cidcnameisParentstatus} 列。

  2. category_child- 実在 { parent_id, child_id}。

  3. category_product- 関係 { product_id, child_category_id}

  4. product- すべての商品の詳細 { pid, pname, pimage, pprice, pstock}

フロントページにすべての親カテゴリリンクを表示しています。今、誰かが親カテゴリのリンクをクリックするたびにproduct、それぞれから 4 つの情報を表示したいと考えています。child categoryparent category

ここに私のコードがありますが、これは現時点では恐ろしいものです。可能な限り最小限に抑えるための助けを探しています。

$fetchChild = $mysqli->query("SELECT child_id from category_child where parent_id='".$mysqli->real_escape_string($pid)."'");
$listchild = array();
if($fetchChild->num_rows > 0) {
    $n = 1;
    while($storeChild = $fetchChild->fetch_assoc()) {
        $listchild['child_id'][$n] = $mysqli->query("SELECT product_id from category_product where child_category_id='".$mysqli->real_escape_string($storeChild[$n])."'");
        if($listchild['child_id'][$n]->num_rows > 0) {
            $i = 1;
            while($storeMore = $listchild['child_id'][$n]->fetch_assoc()) {
                $listchild['product_id'][$i] = $mysqli->query("SELECT pid, pname, pimage, pprice, pstock from product where pid='".$mysqli->real_escape_string($storeMore[$i])."'");
                if($listchild['child_id'][$n]['product_id'][$i]->num_rows > 0) {
                    $me = 1;
                    while($smeLast = $storeMore[$i]->fetch_assoc()) {
                        $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pid'];
                        $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pname'];
                        $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pimage'];
                        $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pprice'];
                        $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pstock'];
                        $me++;
                    }
                } else {
                    echo '<meta http-equiv="refresh" content="0; url=index.php?error=Something+Went+Wrong+We+are+Fixing+it" />';
                }
                $listchild['product_id'][$i]->free();
                $i++;
            }
        }
        $listchild['child_id'][$n]->free();
        $n++;
    }

} else {
    echo '<meta http-equiv="refresh" content="0; url=index.php" />';
}
$fetchChild->free();

私のコードでネストされたwhileとクエリを最小限に抑えるのに親切に助けてください。

ありがとう

4

3 に答える 3

2

JOINS を使用すると、すべてのクエリを 1 つのクエリに減らすことができます。結合を使用すると、別のテーブル (例: category_product、category_child) で提供された条件に基づいて、1 つのテーブル (例: product) から結果を返すことができます。

ジョインの詳細については、スタック オーバーフローのどこかを参照するか、他のリソースを参照してください。たとえばhttp://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

于 2013-10-01T20:10:21.823 に答える
1

ループ内で SQL クエリを使用しないでください。それは非常に遅く、SQLサーバーなどに過負荷をかける可能性があります...

データベース構造が正しくありません。階層ツリーを保存したい場合は、より良いオプションがあります:

ツリー 1 レベル:

      1A2

ツリー 2 レベル:

      1A6
   2B3   4C5

ツリー 3 レベル:

          1A12
   2B7    8C9   10D11
3E4   5F6

各ノードごとに左と右の値があり、親 ID も持つことができます。左右の違いを見ると、節が葉なのか枝なのかがわかります。葉によって、それは一つです。左が枝の左よりも大きく、右が枝の右よりも小さい場合、葉が枝の下にあるかどうかを確認できます。など...この構造は、いくつかのサイトで説明されています。たとえば、次のとおりです。ネストされたセットモデル

モデルをネストされたセットに変換した後、単純な sql を使用して製品を要求できます。このようなもの:

SELECT
    p.*
FROM
    categories c, categories b, products p, product_categories pc
WHERE
    b.category_id = ?
AND
    c_category_id <> b.category_id
AND
    c.category_left BETWEEN b.category_left AND b.category_right
AND
    c.category_right - c.category_left = 1
AND
    c.category_id = pc.category_id
AND
    p.product_id = pc.product_id

これは最初に適しています。コードには group by や limit などが含まれます...カテゴリごとに 1 つの製品のみを要求するためです... (または、単純に order by rand() と limit 4 を使用できます... )

手動でエスケープする代わりに、準備されたステートメントを使用する必要があります... http://php.net/manual/en/mysqli.prepare.php

于 2013-10-01T20:07:38.693 に答える