2016-06-17 4 views
1
내가 MySQL 데이터베이스라는 한

"문제"를 여러 HTML 테이블에 대한 결과를 준비하기 위해 가입 : 차량의 서로 다른 "종류"를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입니다

, 나는 다음과 같은 두 가지 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 

내가 먼저 CROSS이 (유형, 모델) 및 (년)의 모든 조합을 얻기 위해 가입 사용할 수 있습니다. 그런 다음 원래 테이블에 존재하지 않는 조합 ("문제점")을 찾기 위해 존재하지 않는 곳을 사용합니다. 다음으로 원본 테이블 (플래그 = '.')에 존재하지 않는 조합을 인 조합 (플래그 = '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

참고로, 지금은 순수한 SQL 솔루션을 추가했습니다. – synaptik