В течение последнего месяца я создавал систему эталонных показателей, которая позволяет пользователям добавлять категории и элементы эталонных показателей, которые сохраняют данные каждую неделю в течение определенного года. У меня возникли проблемы с созданием оператора mysql, который показывает каждый контрольный элемент с его результатами за все недели в течение года, даже если за эту неделю нет данных или нет данных за год. Ниже приведены запросы, которые я тестировал, и столбцы таблицы. Я использую codeigniter и планирую отображать результаты в формате, указанном внизу. Прошу прощения за такое длинное описание, но я стараюсь быть максимально ясным. Любая помощь будет оценена.

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
Kelvin Checo 2 Дек 2014 в 10:18

2 ответа

Я добавил некоторые изменения в свой код, которые почти дают ответ, который я ищу. Единственная проблема сейчас заключается в том, что у меня отображаются два элемента с одним результатом для каждого элемента.

Моя модель:

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>

Формат таблицы из результата запроса - Проблема заключается в том, что в первой и второй записи отображаются оба результата. В первой записи результат записан 7.11.14, а во второй записи результат записан 11.07.14:

+-----------------------------------------+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
|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
Kelvin Checo 4 Дек 2014 в 10:31

РЕШЕНО

В модели я изменил запрос. Я удалил соединение с таблицей tblbenchmarkitems и убрал необходимость указывать itemID в операторе where. Я добавил поле FKitemID в вывод, чтобы убедиться, что результат соответствует конкретному оцениваемому элементу (т. е. если идентификатор элемента равен 1, а результаты, представленные в массиве, принадлежат элементу с идентификатором 1). , затем отобразите данные только для идентификатора 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>

Наконец, в представлении я добавил оператор if после второго цикла for (тот, который выводит данные в течение нескольких недель). Он проверяет, есть ли результат с идентификатором выводимого элемента, и если он есть, то отображает его только в той строке и столбце, которым он соответствует. Если нет, то отобразите «0.00».

0
Kelvin Checo 5 Дек 2014 в 08:38