0

データベースクエリをどの方法で使用するかを考えています。最近mysqlでPDOを使い始めました。メーカーをチェックし、各メーカーに対してアイテムをチェックする小さなスクリプトを書いています。アイテムを配列に配置して(1つのクエリのみを使用)、製造元の配列のループとして、array_count_valuesを使用してアイテムの数量を取得するか、ループで別のクエリを実行してアイテムをカウントする方が速いかどうか、私は立ち往生しています. 現在、約400のメーカーと70000のアイテムを持っています。

配列を使用した現在のコードは次のとおりです。

$itemquery = $conn->query("SELECT manufacturer FROM item_info_short");
$itemquery->execute();
$itemrow = $itemquery->fetchall(PDO::FETCH_ASSOC);
foreach ($itemrow as $itkey => $itvalue) {
   $items[] = $itvalue[manufacturer];
}
$it_qty = array_count_values($items);

そして私のループのために:

$manu_query = $conn->query("SELECT manufacturer FROM manufacturers ORDER BY manufacturer");
while($rowsx = $manu_query->fetch(PDO::FETCH_ASSOC)){
    $rowid = $rowsx[manufacturer];
    $count = $it_qty[$rowid];
    if($count == '') $count = 0;
    echo "<option value=\"$rowsx[manufacturer]\">$rowsx[manufacturer]&emsp;$count Items</option>";
}

ご覧のとおり、2 つの PDO クエリをまとめて使用しています。もう 1 つの方法では、401 クエリを使用します。

どの方法がベストプラクティスであるか、および/またはより速いかを確認しようとしています。

アドバイスをよろしくお願いします。

4

2 に答える 2

1
  1. あなたの質問は PDO とは無関係です
  2. あなたは非常に非効率的な方法でやっていますが、あなたが尋ねた質問とは無関係です.
  3. あなたがしなければならない質問は、「どちらが速いか」ではなく、「どちらが正しい方法か」である必要があります。

商品数の多いメーカーの数を取得するには、それらを数える SQL を作成する必要があります。

SELECT manufacturer, count(*) cnt FROM item_info_short GROP BY manufacturer


製造業者の詳細を取得したい場合は、すべての製造業者とその商品数を返します - このクエリを製造業者テーブルに結合します

すべてのメーカーとその商品をリストする必要がある場合は、
次のようにLEFT JOIN を使用します

SELECT m.manufacturer, count(i.manufacturer) cnt 
    FROM manufacturers m LEFT JOIN item_info_short i
    ON i.manufacturer = m.manufacturer GROUP BY m.manufacturer
于 2013-02-06T14:08:41.290 に答える
0

「あなたの常識」に感謝しますが、「item_info_short」テーブルにないメーカーに対して 0 件の結果が表示されませんでした。

SELECT m.manufacturer, 
      (SELECT COUNT(i.manufacturer) FROM item_info_short i 
                     WHERE m.manufacturer = i.manufacturer) cnt 
      FROM manufacturers m ORDER BY m.manufacturer ASC;

これは、私が実際に使用した最後の mysql ステートメントであり、0 の値を含む item_info_short からのメーカーとその数量の完全なリストを提供します。私自身の質問に答えると、この方法は最初に配列に入れるよりもはるかに高速であり、これが正しい方法であると信じています。

于 2013-02-07T10:20:50.063 に答える