2014-12-02 67 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“。