2014-01-04 2 views
0

У меня есть следующие MySQL скрипт, который вытаскивает именно данные мне нужно:Как сослаться на сумму конкретных ячеек MySQL в PHP

SELECT gate, 
    sum(case when grade = 'Echo4' then 1 else 0 end) echo4, 
    sum(case when grade = 'Echo5' then 1 else 0 end) echo5, 
    sum(case when grade = 'Echo6' then 1 else 0 end) echo6, 
    sum(case when grade = 'Echo7' then 1 else 0 end) echo7, 
count(*) total 
from MyTable 
group by gate with rollup 

Я хочу, чтобы отобразить данные в HTML-таблицы, которые я знаю, как чтобы построить, если бы я знал, как обращаться к отображаемым ячейкам. Мой результат выглядит следующим образом:

gate  echo4 echo5 echo6 echo7 total 
Center  14  32  3  1  50 
Right  5  27  20  8  60 
Left  2  37  12  0  51 
Middle  4  12  5  0  21 
East  0  9  2  0  11 
West  0  32  11  1  44 
North  1  29  9  0  39 
South  8  61  29  0  98 
HQ   1  1  1  0  3 
NULL  35  240  92  10  377 

В PHP, как я отсылаю к пересечению «Центр» и «Echo4»? ... «Центр» и «Эхо5»? и т. д.

+0

строка ['echo4'] и вы создаете ее в цикле while – Mihai

+0

Вы можете, например, при извлечении строк добавить их к массиву, который _indexed_ by 'gate', как' $ rows [$ current_row ['gate ']] = $ current_row; 'Тогда становится легко получить к ним доступ, как' $ rows [' North '] [' echo5 '] 'Без какого-либо конкретного PHP-кода я не могу быть более конкретным. –

+0

укажите структуру нужной таблицы html; также покажите код, который вы пробовали, и укажите, как результаты отличаются от ваших ожиданий. –

ответ

0

Самый простой способ для хранения вещей в терминах массива ... Я буду очень универсален, но должен получить точку в поперечнике.

$query = ' 
    SELECT gate, 
     CAST(SUM(CASE grade WHEN 'Echo4' THEN 1 ELSE 0 END) AS INTEGER) AS echo4, 
     CAST(SUM(CASE grade WHEN 'Echo5' THEN 1 ELSE 0 END) AS INTEGER) AS echo5,  
     CAST(SUM(CASE grade WHEN 'Echo6' THEN 1 ELSE 0 END) AS INTEGER) AS echo6, 
     CAST(SUM(CASE grade WHEN 'Echo7' THEN 1 ELSE 0 END) AS INTEGER) AS echo7, 
     COUNT(*) AS total 
    FROM MyTable 
    GROUP BY gate WITH ROLLUP 
'; 

$grade = array(); 
if ($stmt = mysqli_prepare($link, $query)) { 
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_bind_result($stmt, $gate, $echo4, $echo5, $echo6, $echo7, $total); 

    while (mysqli_stmt_fetch($stmt)) { 
     $grade[$gate]['echo4'] = $echo4; 
     $grade[$gate]['echo5'] = $echo5; 
     $grade[$gate]['echo6'] = $echo6; 
     $grade[$gate]['echo7'] = $echo7; 
     $grade[$gate]['total'] = $total; 
    } 

    mysqli_stmt_close($stmt); 
} 

Затем вы можете ссылаться на него позже ворот и должность:

echo $grade['Center']['echo4']; 

Если сделать трюк. Обратите внимание, что это с привязанными операторами, но вы должны иметь возможность изменить его для стандартного оператора mysqli. Заметьте, что я обновил ваш запрос, чтобы сделать его более результативным, сделав вместо операторов выражения CASE значение выражений и явно CAST их.

0

Вам не нужно получать пересечение, так как вы собираетесь получать строки из запроса к базе данных, а в этом поле будет поле.

$result = mysql_query($sql); 

while($row = mysql_fetch_row($result)){ 
    echo '<tr><th>'.$result['gate'].'</th>...other columns...<td>'.$result['Echo4'].'</td></tr>' 
} 
1

Полный ответ.

Сначала мы подключаемся к базе данных, затем запускаем наш запрос и извлекаем данные в объект. Затем мы перебираем все результаты и выводим данные.

<?php 
    try { 
     $DBH = new PDO("mysql:host=localhost;dbname=databaseName", "username", "password"); 
     $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch (PDOException $e) { 
     echo "Ups. Something went wrong " . $e->getMessage(); 
    } 
    //Next, do your query 
    $STH = $DBH->query("SELECT gate, 
           sum(case when grade = 'Echo4' then 1 else 0 end) echo4, 
           sum(case when grade = 'Echo5' then 1 else 0 end) echo5, 
           sum(case when grade = 'Echo6' then 1 else 0 end) echo6, 
           sum(case when grade = 'Echo7' then 1 else 0 end) echo7, 
          count(*) total 
          from MyTable 
          group by gate with rollup"); 

    //Set the fetch mode, i like objects. 
    $STH->setFetchMode(PDO::FETCH_OBJ); 
     //Lets do some html. 
    echo '<table> 
      <tr> 
       <td>Gate</td> 
       <td>echo4</td> 
       <td>echo5</td> 
       <td>echo6</td> 
       <td>echo7</td> 
       <td>total</td> 
      </tr>'; 

    //Lets output the result. 
    foreach($STH->fetchAll() as $object) 
     echo '<tr> 
       <td>' . $object->gate . '</td> 
       <td>' . $object->echo4 . '</td> 
       <td>' . $object->echo5 . '</td> 
       <td>' . $object->echo6 . '</td> 
       <td>' . $object->echo7 . '</td> 
       <td>' . ($object->echo4 + $object->echo5 + $object->echo6 + $object->echo7) . '</td> 
      </tr>'; 
    } 

    //Lets close that table. 
    echo '</table>'; 
?> 
Смежные вопросы