2016-06-17 5 views
1
私はMySQLデータベースが命名した

「問題」を複数のHTMLテーブルの結果を整理するために、JOIN:車の異なる「種類」についてはMySQLは、PHPで

year type model 
    ---- ---- ----- 
    2016 Cars A 
    2016 Cars B 
    2015 Cars A 
    2014 Cars C 
    2015 Vans D 
    2014 Vans E 

、それは問題を抱えている「モデル」を示していますし、これらのモデルに問題がある年。

車種ごとに別々のHTMLテーブルを作成する必要があります。各テーブルでは、各モデルの行と各年の列が必要です。問題を指定するセルには「Y」を使用し、問題を指定するピリオド(「。」)を使用します。車用

HTMLテーブル:バン用

2016 2015 2014 
A Y  Y  . 
B Y  .  . 
C .  .  Y 

HTMLテーブル:

2016 2015 2014 
D .  Y  . 
E .  .  Y 

Iである

は、私は次の2つのHTMLテーブルを作成する必要がありますPHPでmysqliを使用してデータベースにクエリを行い、テーブルを構築します。私はテーブルごとに別々のクエリを作成することができますが、これは最も経済的なアプローチのようには見えません。順序付けされた行を返すクエリを実行できるので、基本的にこのような繰り返しパターンを実行できますか?

for type in types: 
    // write start of <TABLE> 
    for model in models: 
     // write start of <TR> 
     for year in years: 
      // write <TD> 
     // write close of <TR> 
    //write close of <TABLE> 

多くの異なるクエリを実行することに意味がある場合は、アドバイスしてください。あなたは上記の示したロジックを使用して、その結果によってその後

SELECT * FROM Problems ORDER BY VehicleType, VehicleModel, VehicleYear; 

、ループ:

答えて

1

はこれに激しく苦労した後、私は最終的に純粋なSQLソリューションを思い付くことをどうにか:

SELECT * FROM 
(
    SELECT `type`, `model`, `year`, '.' AS flag 
    FROM (
     SELECT * FROM 
     (SELECT `type`, `model` FROM Problems GROUP BY `type`, `model`) tt 
     CROSS JOIN 
     (SELECT DISTINCT `year` FROM Problems) d 
     ) x 
    WHERE NOT EXISTS (
      SELECT 1 
      FROM Problems h 
      WHERE x.`year` = h.`year` AND x.`type` = h.`type` AND x.`model` = h.`model` 
     ) 
    UNION 
    SELECT `type`, `model`, `year`, 'Y' AS flag 
    FROM Problems 
    ORDER BY `type`, `model`, `year` 
) z 
WHERE `year` >= 2010 AND `year` <= 2017 

私が最初(タイプ、モデル)および(年)のすべての組み合わせを得るために、JOIN CROSSを使用しています。次に、存在しないWHERE NOT EXISTSを使用して、元のテーブルに存在しない組み合わせ(「問題」)を検索します。次に、元のテーブル(フラグ= '。'を持つ)に存在しない組み合わせを、である組み合わせ(フラグ= 'Y'を持つ)に結合します。最後に、私は2010年から2017年の日付範囲でフィルタリングします。

+1

あなたのために良い、今すぐフェッチする時間は、そのすべてが並んで – Ghost

1

は、クエリのこのような何かを実行することができます。クエリ自体は必要な場所に行を配置しませんが、結果をループすることができるようにクエリ結果を並べ替えるので、レイアウトしたロジックはうまく動作します。

+0

主な問題は、毎年何か問題があるとは限らないため、テーブルに入れる年を知りませんすべての「タイプ」に対して。 – synaptik

+0

その年に何の問題もないことを示すピリオドは、年をすべて列挙したいとは思わないのですか? (上記のあなたのバンテーブルに2016年に問題がなかったように) –

+0

はい、あります。あなたが提案した方法で、どのように年間のリストを知ることができますか? – synaptik

1

あなたは間違いなくそのことを行うSQLから何かを考え出すことができますが、私は今考えることはできませんが、別の方法は、テーブルのプレゼンテーションのフォーマットに合うように配列を再編成することです。

私は、フォーマットに従ってグループ化するだけです。

最初にタイプ別に分類し、モデル別に、次に年度別にグループ化します。その順序で並べます。

$data[type][model][year] 

フェッチ中に配列を並べ替える必要があることに注意してください。

この考え方に従うことができます。これはあなたに簡単な選択を与える:Y''は値の単なるプレースホルダであることを

$sql = 'SELECT * FROM problems'; 
$query = $con->query($sql); 
while($row = $query->fetch_assoc()) { 
    for($i = date('Y'); $i > 2013; $i--) { 
     $data[$row['type']][$row['model']][$i][] = ($i == $row['year']) ? 'Y' : '';  } 
} 

注、あなたがそこに持っている任意の型を持つことができます。

そのグループ化した後、あなたがこの形式で終わるだろう、これはあなたのマークアップでエコーすることが容易になります

Array 
(
    [cars] => Array 
     (
      [A] => Array 
       (
        [2016] => 
        [2015] => Y 
        [2014] => 
       ) 

      [B] => Array 
       (
        [2016] => Y 
        [2015] => 
        [2014] => 
       ) 

      [C] => Array 
       (
        [2016] => 
        [2015] => 
        [2014] => Y 
       ) 

     ) 

    [vans] => Array 
     (
      [D] => Array 
       (
        [2016] => 
        [2015] => Y 
        [2014] => 
       ) 

      [E] => Array 
       (
        [2016] => 
        [2015] => 
        [2014] => Y 
       ) 

     ) 

) 

は今、あなたはちょうど foreachのシリーズを使用して、それのために行きますよ。最初のループは type(車、バンなど)を表す各テーブルに移動します。各テーブルには独自のテーブルが必要です。

次に、それぞれの車のモデル。最後に、どの年が価値があるのか​​。

<?php foreach($data as $type => $v1) : ?> 
    <h4><?php echo $type; ?></h4><!-- clasification --> 
    <table id="<?php echo $type; ?>" cellpadding="10"> 
     <!-- year header --> 
     <tr><th></th><?php foreach(array_keys(reset($v1)) as $year) echo "<th>{$year}</th>"; ?></tr> 

     <?php foreach($v1 as $model => $v2): ?> 
      <tr align="center"> 
       <td><?php echo $model; ?></td> 
       <?php for($i = date('Y'); $i > 2013; $i--): ?> 
        <td><?php echo (!empty(array_filter($v2[$i]))) ? 'Y' : '.'; ?></td> 
       <?php endfor; ?> 

      </tr> 
     <?php endforeach; ?> 


    </table> 
<?php endforeach; ?> 

これにより、上記の図のような構造が作成されます。自分でデザインする必要があることに注意してください。

+0

ありがとうございます。私は本当に純粋なSQLソリューションを知りたいので、あなたになるかどうか教えてください。 – synaptik

+0

FYI、私は今すぐ純粋なSQLソリューションを追加しました。 – synaptik