Как отобразить данные MySQL в диапазоне строк с использованием PHP? - PullRequest
1 голос
/ 20 октября 2008

У меня есть данные из MySQL, показывающие все организации, которые получил клиент, со всеми подробностями занятости в каждой организации. Я хочу перечислить каждое название организации только один раз, т. Е. В одной ячейке (диапазон строк), и все сотрудники в этой организации с этим именем, например:

Org1     Emp1 Name, Emp1 Phone, Emp1 Address
         Emp2 Name, Emp2 Phone, Emp2 Address


Org2     Emp1 Name, Emp1 Phone, Emp1 Address
         Emp2 Name, Emp2 Phone, Emp2 Address

Как я могу отобразить эти данные, потому что число сотрудников для каждой организации неизвестно в продвинутом, поэтому я не собираюсь задавать значение rowspan. Точно так же, как начать ряд для другой организации? Должен ли я написать два запроса?

Большое спасибо.

Ответы [ 7 ]

4 голосов
/ 20 октября 2008
// Get the data
$data = mysql_query('SELECT org, emp_name, emp_phone, emp_address FROM x');

// Store it all in a 2D array, keyed by org
$rows = array();
while ($row = mysql_fetch_assoc($data))
{
    // Initialise each org to an empty array (not really needed in PHP but I prefer it)
    if (empty($rows[$row['org']]))
        $rows[$row['org']] = array();

    $rows[$row['org']][] = $row;
}

// Print it out
foreach ($rows as $org => $employees)
{
    print('<tr><td rowspan="' . count($employees) . '">' . htmlentities($org) . '</td>');

    foreach ($employees as $i => $employee)
    {
        // If $i == 0, we've already printed the <tr> before the loop
        if ($i)
            print('<tr>');

        print('<td>......</td></tr>');
    }
}
4 голосов
/ 20 октября 2008

Классический.

Обходной путь: отображать имя, только если оно отличается от предыдущего. Вы даже можете не беспокоиться о диапазоне строк (у вас есть пустая ячейка).

$currentOrg = '';
while ($row = mysql_fetch_object($query)) {
   if ($row->org != $currentOrg) {
      echo "$row->org".
   }
   $currentorg = $row->org;
}

Не самый красивый, но такой простой.

0 голосов
/ 08 июня 2009

Как насчет использования пакета груши HTML_Table, как в следующем примере, через мне также нравится версия ROLLUP от Jrgns

    <?php

    require_once "HTML/Table.php";




    $table = new HTML_Table(array('border'=>'1'));
    $bo=array(
        array('6','a2','a3','a4'),
        array('1','b2','b3','b4'),
        array('1','c2','c3','c4') ,
        array('2','c2','c3','c4') ,
        array('2','c2','c3','c4') ,
        array('4','c2','c3','c4') );

    foreach ($bo as $r => $borow)
        $table->addRow($borow);

    $rsFirst=0;
    $rsLen=0; 
    foreach ($bo as $r => $borow) {
        if ($r!=0 and $borow[0]!=$prevrow[0] ) {
            //jump in values
            $table->setCellAttributes ( $rsFirst,0, array('rowspan'=>$rsLen));
            $rsFirst=$r;
            $rsLen=0;
        }
        $prevrow=$borow;
        $rsLen++; 
        if ($r==sizeof($bo) - 1) {
            $table->setCellAttributes ( $rsFirst,0, array('rowspan'=>$rsLen));
        }
    }


    echo $table->toHTML();

    ?>

сервас, бурль

0 голосов
/ 20 октября 2008

Это не поможет вам с разбросом строк, но посмотрите на модификатор WITH ROLLUP. Он возвращает данные в формате, аналогичном тому, что вы хотите.

0 голосов
/ 20 октября 2008

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

0 голосов
/ 20 октября 2008

Может быть проще (но менее эффективно) сделать запрос для каждой организации (плюс один запрос, чтобы узнать, сколько организаций, по-видимому, существует).

Лучшим способом сделать это было бы зациклить массив заранее. Например:

$sql = $mysqli->query('SELECT * FROM `organisation_members` ORDER BY `organisation` DESC');

if (!$sql || $sql->num_rows) {
    // No data
} else {
    $data = array();
    while ($row = $sql->fetch_assoc()) {}
        if (!array_key_exists($row['organisation'], $data)) {
            $data[$row['organisation']] = array();
        }
        $data[$row['organisation']][]['name'] = $row['name'];
        // ...
    }
    $sql->close();
    echo '<table>';
    foreach ($data as $org => $people) {
        $people_in_org = count($data[$org]) - 1;
        $counter = 0;

        echo '<tr>';
        echo '<td rowspan="' . $people_in_org + 1 . '">' . $org . '</td>';

        while ($counter < $people_in_org) {
            if (counter > 0) {
                echo '<tr>';
            }
            echo '<td>' . $people[$counter]['name'] . '</td>';
            // etc
            echo '</tr>';
        }
    }
    echo '</table>';
}
0 голосов
/ 20 октября 2008

Чтобы сделать правильный rowspan, вам нужно знать номер заранее.

Это оставляет вас с:

  • повторяет результат запроса дважды, считая значения до их изменения
  • запрашивает у сервера БД счетчик

Лично я бы пошел с методом номер два. Серверы БД довольно эффективны с подсчетом строк, вероятно, это будет намного быстрее, если будет отображаться много строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...