2014-12-02 37 views
0

在過去的一個月裏,我一直在創建一個基準測試系統,允許用戶添加類別&基準測試項目,該測試項目在特定年份內每週保留數據。我無法創建一個mysql語句,該語句在每年的所有星期內顯示每個基準項目的結果,即使那一週沒有數據或一年中沒有數據。以下是我一直在測試的查詢和表格列。我正在使用codeigniter,並計劃以底部顯示的格式顯示結果。我爲這篇冗長的描述道歉,但我試圖儘可能清楚。任何幫助將不勝感激。MYSQL-在循環周結束日期時顯示數據

tblbenchmarkitem 
================= 
itemID | itemDescription | itemTarget | ItemFreq | FKcategoryID 

tblbenchmarkData 
================ 
dataID | FKitemID | resultDate | result | dateAdded | dateModified 

tblcategories 
=============== 
categoryID | categoryName | parentID | FKdeptID 

tblcalendardates - stores 52 weeks for year Saturday to Friday 
================ 
id | year | startDate | endDate 

這些是我在模型中的mysql語句。我將在該年的函數參數中設置一個默認值。

public function get_data() { 
    $dates = $this->db->query("SELECT endDate FROM tblcalendardates WHERE year = '2014' ORDER BY endDate"); 
    $dates = $dates->result(); 
    foreach ($dates as $date) { 
     //$query = "SELECT tblcalendardates.enddate, tblbenchmarkitems.itemDescription, tblbenchmarkitems.itemTarget, tblbenchmarkitems.itemFrequency, tblbenchmarkdata.resultDate, IFNULL(tblbenchmarkdata.result,0) AS result, (SELECT strCategoryName FROM tblcategories WHERE tblbenchmarkitems.FKcategoryID = tblcategories.categoryID) AS category FROM tblbenchmarkdata LEFT JOIN tblbenchmarkitems ON tblbenchmarkdata.FKitemID = tblbenchmarkitems.itemID JOIN tblcalendardates WHERE DATE(tblbenchmarkdata.resultDate) BETWEEN (SELECT MIN(DATE(tblcalendardates.startdate)) FROM tblcalendardates WHERE tblcalendardates.year = " . date('Y') . ") AND (SELECT MAX(DATE(tblcalendardates.enddate)) FROM tblcalendardates WHERE tblcalendardates.year = " . date('Y') . ") GROUP BY category ORDER BY tblcalendardates.enddate"; 
     $query = 'SELECT c.*, i.itemDescription, i.itemTarget, IFNULL(d.result, 0) as result,"' . $date ->endDate . '" FROM tblcategories AS c JOIN tblbenchmarkitems AS i ON i.FKcategoryID = c.categoryID JOIN tblbenchmarkdata as d ON i.itemID = d.FKitemID JOIN tblcalendardates WHERE DATE(d.resultDate) BETWEEN (SELECT MIN(DATE(tblcalendardates.startdate)) FROM tblcalendardates WHERE tblcalendardates.year = "' . date('Y') . '") AND (SELECT MAX(DATE(tblcalendardates.enddate)) FROM tblcalendardates WHERE tblcalendardates.year = "' . date('Y') . '") GROUP BY strCategoryName'; 
     $query = $this->db->query($query); 

    return $query->result(); 
    } 
} 

這在我看來是

<table class="table table-hover data-list"> 
    <thead> 
     <tr> 
      <th class="th-set-width1">Benchmark Item</th> 
      <th class="th-set-width2">Target</th> 
     <?php foreach($weeks as $week): ?> 
      <th class="th-set-width2"><?php echo date('m-d-Y', strtotime($week->enddate)); ?></th> 
     <?php endforeach; ?> 
     </tr> 
    </thead> 
    <tbody> 
     <?php foreach($entries as $entry) : ?> 
     <tr> 
      <td><?php echo $entry->itemDescription; ?></td> 
      <td><?php echo $entry->itemTarget; ?></td> 
      <?php for ($i = 0; $i < 52; $i++) : ?> 
      <?php if ($entry->result != NULL || $entry->result > 0): ?> 
       <td><?php echo $entry->result; ?></td> 
      <?php else: ?> 
       <td>0</td> 
      <?php endif; ?> 
      <?php endfor; ?> 
     </tr> 
     <?php endforeach; ?> 
    </tbody> 
</table> 

這是我想在一個表格中顯示的數據。

----------------------------------------------------------------------------------- 
categoryName 
==================================================================================== 
itemDescription | itemTarget | 01-03-14 | 01-10-14 | 01-17-14 | 01-24-14 | 01-31-14 
===================================================================================== 
No. of Visits | 12.00 | NULL | NULL | 15.00 | NULL | 20.00 
No. of Calls | 17.00 | 12.00 | NULL | 17.00 | 22.00 | NULL 

回答

0

我已經添加了一些對我的代碼的更改,幾乎可以得到我期待的響應。現在唯一的問題是,我有兩個項目正在顯示,每個項目的結果。

我的模型:

public function get_data() { 
    $items = $this->db->query('SELECT * FROM tblbenchmarkitems'); 
    $items = $items->result(); 
    foreach ($items as $item) { 
     $query = 'SELECT c.endDate, IFNULL(d.result,0) as result FROM tblbenchmarkdata AS d RIGHT JOIN tblcalendardates as c ON (DATE(d.resultDate) = c.endDate) JOIN tblbenchmarkitems as i WHERE c.year = "2014" AND i.itemID = "' . $item->itemID .'" GROUP BY c.endDate'; 
     $query = $this->db->query($query); 
     $data[] = array(
      'itemID'   => $item->itemID, 
      'itemDescription' => $item->itemDescription, 
      'itemTarget'  => $item->itemTarget, 
      'dates'    => $query->result() 
     ); 
    } 
    return $data; 
} 

我的看法:從查詢結果

<table class="table table-hover data-list"> 
    <thead> 
    <tr> 
     <th class="th-set-width1">Benchmark Item</th> 
     <th class="th-set-width2">Target</th> 
    <?php foreach($weeks as $week): ?> 
     <th class="th-set-width2"><?php echo date('m-d-Y', strtotime($week->enddate)); ?></th> 
    <?php endforeach; ?> 
    </tr> 
    </thead> 

    <tbody> 

    <?php for($n = 0; $n < count($entries); $n++) : ?> 

    <tr> 
     <td><?php echo $entries[$n]['itemDescription']; ?></td> 
     <td><?php echo $entries[$n]['itemTarget']; ?></td> 
     <?php for($i = 0; $i < count($entries[$n]['dates']); $i++) :?> 
     <td><?php echo $entries[$n]['dates'][$i]->result; ?></td> 
     <?php endfor; ?> 
    </tr> 

    <?php endfor; ?> 

    </tbody> 

</table> 

表格式 - 問題是記錄一個記錄兩個具有顯示兩個結果。記錄一個具有記錄在14年11月7日和記錄兩個結果有記錄在14年7月11日結果:

+-----------------------------------------+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ 
|Benchmark Item       | Target |01-03-2014|01-10-2014|01-17-2014|01-24-2014|01-31-2014|02-07-2014|02-14-2014|02-21-2014|02-28-2014|03-07-2014|03-14-2014|03-21-2014|03-28-2014|04-04-2014|04-11-2014|04-18-2014|04-25-2014|05-02-2014|05-09-2014|05-16-2014|05-23-2014|05-30-2014|06-06-2014|06-13-2014|06-20-2014|06-27-2014|07-04-2014|07-11-2014|07-18-2014|07-25-2014|08-01-2014|08-08-2014|08-15-2014|08-22-2014|08-29-2014|09-05-2014|09-12-2014|09-19-2014|09-26-2014|10-03-2014|10-10-2014|10-17-2014|10-24-2014|10-31-2014|11-07-2014|11-14-2014|11-21-2014|11-28-2014|12-05-2014|12-12-2014|12-19-2014|12-26-2014| 
+-----------------------------------------+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ 
|Total No. of Calls Conducted    17.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00 0.00  0.00  0.00  0.00  **2.00**  0.00  0.00  0.00  0.00 0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00   0.00  0.00 **12.00**  0.00  0.00  0.00  0.00  0.00  0.00  0.00 | 
+-----------------------------------------+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ 
|Total No. of Random Visits     29.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00 0.00  0.00  0.00  0.00  **2.00**  0.00  0.00  0.00  0.00 0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00   0.00  0.00 **12.00**  0.00  0.00  0.00  0.00  0.00  0.00  0.00 | 
+-----------------------------------------+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ 
0

解決

在這個模型中,我改變了我的查詢刪除加入到tblbenchmarkitems表並刪除需要在where語句中指定itemID。我將FKitemID字段添加到輸出中以幫助確保結果對應於正在評估的特定項目(即,如果項目ID爲1並且陣列中提供的結果屬於ID爲1的項目,則顯示數據僅用於ID 1.)

模型中的函數獲取基準數據。

public function get_data() { 
    $items = $this->db->query('SELECT * FROM tblbenchmarkitems'); 
    $items = $items->result(); 
    foreach ($items as $item) { 
     $query = 'SELECT c.endDate as weekending, IFNULL(d.result,0) as result, d.FKitemID FROM tblbenchmarkdata AS d RIGHT JOIN tblcalendardates as c ON (DATE(d.resultDate) = c.endDate) WHERE c.year = "2014" GROUP BY weekending'; 
     $query = $this->db->query($query); 
     $data[] = array(
      'itemID'   => $item->itemID, 
      'itemDescription' => $item->itemDescription, 
      'itemTarget'  => $item->itemTarget, 
      'dates'    => $query->result() 
     ); 
    } 
    return $data; 
} 

視圖

<table class="table table-hover data-list"> 
    <thead> 
    <tr> 
     <th class="th-set-width1">Benchmark Item</th> 
     <th class="th-set-width2">Target</th> 

    <?php foreach($weeks as $week): ?> 
     <th class="th-set-width2"><?php echo date('m-d-Y', strtotime($week->enddate)); ?></th> 
    <?php endforeach; ?> 

    </tr> 
    </thead> 

    <tbody> 

    <?php for($n = 0; $n < count($entries); $n++) : ?> 
    <tr> 
     <td><?php echo $entries[$n]['itemDescription']; ?></td> 
     <td><?php echo $entries[$n]['itemTarget']; ?></td> 

    <?php for($i = 0; $i < count($entries[$n]['dates']); $i++) :?> 
     <?php if ($entries[$n]['itemID'] == $entries[$n]['dates'][$i]->FKitemID) : ?> 

     <td><?php echo $entries[$n]['dates'][$i]->result; ?></td> 

     <?php else: ?> 

     <td>0.00</td> 

     <?php endif; ?> 
    <?php endfor; ?> 

    </tr> 
    <?php endfor; ?> 

    </tbody> 
</table> 

最後,在視圖我添加了一個,如果第二for循環(在整個周輸出該數據的一個)之後的語句。它會檢查是否有正在輸出項目的ID的結果,如果它確實顯示,則只在與其對應的行&列中顯示它。如果不是,則顯示「0」。00「。

相關問題