0

件名が質問に適しているかどうかわかりません。

以下に示すように、年情報を含むデータを保持するテーブルがあります。

table mydata
+----+------------+----------+
| id | year       | some_data|
+----+------------+----------+
|  1 | 2011       | x        |
|  2 | 2012       | y        |
|  2 | 2009       | x        |
|  2 | 2007       | z        |
|  1 | 2009       | b        |
|  3 | 2011       | a        |
|  2 | 2007       | n        |
|  3 | 2006       | h        |
|  2 | 2007       | t        |
+----+------------+----------+

これが私の問題です。年情報を含む mydata テーブルから特定の ID のデータをフェッチしようとしています。ただし、現在の過去 6 年間と次の 6 年間など、特定の年の範囲のレコードを表示する必要があります。

例えば;

id = 2

+----+------------+----------+
| id | year       | some_data|
+----+------------+----------+
|  2 | 2007       | z        |
|  2 | 2007       | n        |
|  2 | 2009       | x        |
|  2 | 2012       | y        |
+----+------------+----------+

そして、HTML テーブル構造でそのようなデータを表示する必要があります。

+------------+----------+
| year       | some_data|
+------------+----------+
| 2006       |          |
| 2007       | z        |
|            | n        |
|            | t        |
| 2008       |          |
| 2009       | x        |
| 2010       |          |
| 2011       |          |
| 2012       | y        |
| 2013       |          |
| 2014       |          |
| 2015       |          |
| 2016       |          |
| 2017       |          |
| 2018       |          |
+------------+----------+

どの年に重複した記録があり、どの年に欠落しているのかわかりません。そのため、私は常に複数のクエリまたは多数の for ループを使用してソリューションを試しています。そして、私が望んでいたように機能しません。

そしてアイデア?

4

1 に答える 1

1

データベースからソートされたデータを取得し、出力したい年をループして PHP で出力テーブルを作成します。

たとえば、PDO オブジェクトを使用すると、次のようになります$dbh

$qry = $dbh->prepare('
  SELECT   year, some_data
  FROM     mydata
  WHERE    year BETWEEN :start AND :end
  ORDER BY year
');

$qry->bindParam(':start', $range_start);
$qry->bindParam(':end'  , $range_end  );

$current_year = intval(date('Y'));
$range_start  = $current_year - 6;
$range_end    = $current_year + 6;

if ($qry->execute()) {

  $row = $qry->fetch();

  echo '<table><tr><th scope="col">year</th><th scope="col">some_data</th></tr>';
  for ($y = $range_start; $y <= $range_end; $y++) {
    echo "<tr><th scope=\"row\">$y</th><td><ul>";
    while ($row && $row['year'] == $y) {
      echo '<li>' . htmlentities($row['some_data']) . '</li>';
      $row = $qry->fetch();
    }
    echo "</ul></td></tr>";
  }
  echo '</table>';

}
于 2012-09-07T11:53:51.663 に答える