2012-03-17 4 views
0

私のアプリケーションでは、サブグループに分類された項目がたくさんある在庫管理テーブルを作成する必要があります。以下のためにとアイデア、在庫管理テーブルには次のようになります。いくつかのwhileループを取り除き、結果を表示するための良い考え方

      Location1    Location2    Total 
Desktops // Main Category 
Microsoft //Sub-Category 

Windows 7     23000     150000    173000 
Office 2011     203300     3002    206302 
.... 

Apple  //Sub-Category 
OS Snow Leopard    4000     3000     7003 
OS Lion      39494     40034     79528 
... 

Tablets //Main Category 
Lenovo  //Sub-Cateogry 

LX-243      3434     4399     7833 
... 

これは、テーブルには今私が私のために、それは怖いことない巨大なMySQLのクエリを持って、どのように見えるかを視覚化したものです。要旨では、私は何をやっていることは以下の通りです:

  1. 第一のカテゴリを選択し、サブカテゴリーはメインカテゴリに対応する選択して、しばらく起動 //メインカテゴリ
  2. としてエコーwhileループを開始しますもう一度ループします。 //エコーをサブカテゴリとして使用
  3. サブカテゴリ内のすべてのアイテムを選択し、whileループを開始します。
  4. 1番目の場所を選択します。
  5. 現在のアイテムを3から選択し、現在の場所を4から選択し、エコーアイテムを選択します。 //アイテムの名前と場所の数量をエコーし​​ます。

今ここに私の質問はしばらくの間、いくつかのループを使用するよりも、これを表示するための良い方法はありますされている、私は、関数を使用してみましたが、彼らはあまりにも混乱になっています。また、私は最後の列に合計を得るために計算をどこで実行すべきか分かりませんでした。

データベースの構造:

Category: CategoryID, Description 
Sub-Cateogry: Sub-Category_ID, Category_ID, Description 
Item: Item_ID, Sub-category_id, Description 
Location: Location_ID, Description 
Stock_Management: Item_ID, Location_ID, Quantity 

コードが要求されるように:

$sql = mysql_query("select Board_ID, Title from Board where Company_ID = '$company_id' order by Title"); 

while($row = mysql_fetch_array($sql)) { 
     $curr_ID = $row[0]; 
     $curr_category = $row[1]; 
     echo "<tr class='sub-heading' style='background: rgba(76, 178, 255, 0.1)'><td colspan='".$count."'>".$curr_category."</td></tr>"; 
     $sql1 = mysql_query("select Sub_Category_ID, Title from Sub_Category where Category_ID = '$curr_ID' order by Title"); 
     while($row1 = mysql_fetch_array($sql1)) { 
      $curr_sub_cat_id = $row1[0]; 
      $curr_sub_cate = $row1[1]; 
      echo "<tr style='background: rgba(149, 255, 145, 0.10'><td colspan='".$count."'><b>".$curr_sub_cate."</b></td></tr>"; 
      $sql2 = mysql_query("select Book_ID, title from Book where sub_category_id = '$curr_sub_cat_id' Order by title"); 
      while($row2 = mysql_fetch_array($sql2)) { 
       $curr_book = $row2[0]; 
       echo "<tr><td>".$row2[1]."</td>"; 
       $sql4 = mysql_query("select OfficeID, OfficeTitle from Office where OfficeTitle IN ('$locations')"); 
       while($row3 = mysql_fetch_array($sql4)) { 
        $curr_location = $row3[0]; 
        $sql3 = mysql_query("select Quantity from Stock_Management where Book_ID = '$curr_book' and Location_ID = '$curr_location'"); 
        while($row3 = mysql_fetch_array($sql3)) { 
         echo "<td>".$row3[0]."</td>"; 
        } 
       } 
       echo "</tr>"; 
      } 
     } 
    } 
+1

単一のクエリであることを行うことが可能であってもよいし、 1つのループで構成されています。 db構造を投稿してください。 – bfavaretto

+0

あなたが選択を言うとき、あなたはクエリを実行することを意味しますか?私はあなたがすでにすべてのデータを記憶していると思いましたか? – mindandmedia

+0

@mindandmedia申し訳ありませんが、クエリを実行することを意味します – Namit

答えて

1

どのようにこのような何かについて -

<?php 

$locations = array('Location 1', 'Location 2', 'Location 3'); 
$locationCols = array(); 
$locationList = array(); 

foreach ($locations as $location) { 
    $locationColName = preg_replace('[^a-z0-9]', '_', strtolower($location)); 
    $location = mysql_real_escape_string($location); 
    $locationCols[] = "SUM(IF(Office.OfficeTitle = '$location', Stock_Management.Quantity, 0)) AS `$locationColName`"; 
    $locationList[] = "'$location'"; 
} 
$locationCols = implode(', ', $locationCols); 
$locationList = implode(',', $locationList); 

$sql = "SELECT Board.Title AS BoardTitle, Sub_Category.Title AS SubCatTitle, Book.title AS BookTitle, $locationCols, SUM(Stock_Management.Quantity) AS Total 
     FROM Board 
     INNER JOIN Sub_Category 
      ON Board.Board_ID = Sub_Category.Category_ID 
     INNER JOIN Book 
      ON Sub_Category.Sub_Category_ID = Book.sub_category_id 
     INNER JOIN Office 
     LEFT JOIN Stock_Management 
      ON Book.Book_ID = Stock_Management.Book_ID 
      AND Office.OfficeID = Stock_Management.Location_ID 
     WHERE Board.Company_ID = 2 
     AND Office.OfficeTitle IN ($locationList) 
     GROUP BY Board.Title, Sub_Category.Title, Book.title"; 

$result = mysql_query($sql); 

$prevBoard = ''; 
$prevSubCat = ''; 

echo '<table>'; 

while ($row = mysql_fetch_object($result)) { 

    // if new board print board 
    if ($prevBoard != $row->BoardTitle) { 
     echo '<tr class="sub-heading" style="background: rgba(76, 178, 255, 0.1)"><td colspan="">' . $row->BoardTitle . '</td></tr>'; 
    } 
    $prevBoard = $row->BoardTitle; 

    if ($prevSubCat != $row->SubCatTitle) { 
     echo '<tr style="background: rgba(149, 255, 145, 0.10)"><td colspan=""><b>' . $row->SubCatTitle . '</b></td></tr>'; 
    } 
    $prevSubCat = $row->SubCatTitle; 

    // print product row 
    echo '<tr>'; 
    echo "<td>{$row->BookTitle}</td>"; 

    foreach ($locations as $location) { 
     $locationColName = preg_replace('[^a-z0-9]', '_', strtolower($location)); 
     echo "<td>{$row->$locationColName}</td>"; 
    } 

    echo "<td>{$row->Total}</td>"; 
    echo '</tr>'; 
} 

echo '<table>'; 
+0

私は、ユーザーがデータを表示したい場所を選択するオプションを持っているので、これを使用することはできません。だから私は ''場所1'などを使用することはできません。しかし、答えはありがとう – Namit

+0

それは私が場所の選択に基づいて動的に場所フィールドを構築することができた理由です。ユーザーは場所をどのように提出しますか?ロケーションIDの配列ですか? – nnichols

+0

これらはajaxを使って送信され、 'echo $ locations'は' Location1、Location2、Location3'などになります。 – Namit

関連する問題