Группировка вывода MySQL с использованием данных в одном из столбцов - PullRequest
0 голосов
/ 22 марта 2019

Результат запроса:

+--------+-----------+--------------+-----------+
| rol_id | pos_name  | role_name    | sys_name  |
+--------+-----------+--------------+-----------+
|      2 | A Manager | Role A       | System A  |
|      1 | A Manager | Role B       | System A  |
|    105 | A Manager | Role A       | System B  |
|    106 | A Manager | Role B       | System B  |
|    107 | A Manager | Role C       | System B  |
|    108 | A Manager | Role D       | System B  |
|      4 | A Manager | Role A       | System C  |
|     25 | A Manager | Role A       | System C  |
|    100 | A Manager | Role A       | System C  |

Требуемый вывод:

Имя должности «Менеджер» может получить доступ

  • "Система А"
    • "Роль А"
    • "Роль B"
  • "Система B"
    • "Роль А"
    • "Роль B"
    • "Роль С"
    • "Роль D"

и т.д.

Текущий код, использующий цикл for для захвата системных имен:

$posname = mysqli_fetch_array($posresult);
echo $posname['pos_name']. '<br/>';
echo 'A total of ' .$result->num_rows. ' rows were returned<br/>';
$numResults = $result->num_rows;

$all_results = array();

while ($row = mysqli_fetch_assoc($result)) {
    // Append all rows to an array
    $all_results[] = $row;
}

for($i = 0; $i < $numResults; $i++){
    echo $all_results[$i]["sys_name"];
    echo '<br/>';
}

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

Но выше приведен список каждой системы для каждой строки в массиве (ожидаемое поведение с текущим кодом), как я могу сгруппировать вывод, чтобы он выглядел, как указано выше, с каждой системой, перечисленной один раз, и каждой связанной с ней ролью, напечатанной под ней

EDIT Я думал, что делал успехи, но теперь получаю все роли в каждой системе: -

$posname = mysqli_fetch_array($posresult);
echo $posname['pos_name']. '<br/>';
echo 'A total of ' .$result->num_rows. ' rows were returned<br/><br/>';
$numResults = $result->num_rows;

$all_results = array();
while ($row = mysqli_fetch_assoc($result)) {
// Append all rows to an array
$all_results[] = $row;
}

$j = 0;
while ($j < $numResults) {
$sysName = $all_results[$j]["sys_name"];
echo $sysName;
echo '<br/>';

for($i = 0; $i < $numResults; $i++){
if ($all_results[$i]["sys_name"] = $all_results[$j]["sys_name"]){
echo $all_results[$i]["role_name"];
echo '<br/>';
}
}
echo '<br/><hr/>';
$j++;

РЕДАКТИРОВАТЬ: переменная мощность. Система одинакова в каждой строке, что странно, потому что это не так, если вы запускаете запрос в MySQL?

array 
(0 =>array
('rol_id' => '2','pos_name' => 'Manager A','role_name' => 'Role A','sys_name' => 'System A',),
1 =>array 
('rol_id' => '1','pos_name' => 'Manager A','role_name' => 'Role B','sys_name' => 'System A',),
2 =>array
('rol_id' => '105','pos_name' => 'Manager A','role_name' => 'Role A','sys_name' => 'System A',),
3 =>array 
('rol_id' => '106','pos_name' => 'Manager A','role_name' => 'Role B','sys_name' => 'System A',),
4 =>array 
('rol_id' => '107','pos_name' => 'Manager A','role_name' => 'Role C','sys_name' => 'System A',),

РЕДАКТИРОВАТЬ 2: Если я возьму var_export после установки массива, системы верны. Выше, если я var_export после циклов в нижней части кода

РЕДАКТИРОВАТЬ 3: Так что я использовал = вместо == в моем заявлении IF! Я не совсем там, но результат выглядит намного лучше. Обновлюсь, когда я отработаю последнюю часть. Спасибо за комментарий ниже

EDIT FINAL: ниже дано то, что я хочу, теперь я вижу, что @ADyson говорил ниже о сравнении последней строки с текущей. Я использовал $ control для этого. Пришлось поиграть с тем, где его увеличить, но теперь это работает. Спасибо всем

$all_results = array();
while ($row = mysqli_fetch_assoc($result)) {
// Append all rows to an array
$all_results[] = $row;
}
//var_export($all_results);

$j = 0;
$control = $j;
//$all_results[$row['sys_name']][] = $row;
while ($j < $numResults) {
if ($control == $j){
echo 'System Name: ' . $all_results[$j]["sys_name"];
echo '<br/>';

for($i = 0; $i < $numResults; $i++){
if ($all_results[$i]["sys_name"] == $all_results[$j]["sys_name"]){
echo 'Role: ' . $all_results[$i]["role_name"];
echo '<br/>';
$control++;
}
}
echo '<br/>';
}
$j++;
}

1 Ответ

1 голос
/ 22 марта 2019
$all_results = array();
while ($row = mysqli_fetch_assoc($result)) {
// Append all rows to an array
$all_results[] = $row;
}
//var_export($all_results);

$j = 0;
$control = $j;
//$all_results[$row['sys_name']][] = $row;
while ($j < $numResults) {
if ($control == $j){
echo 'System Name: ' . $all_results[$j]["sys_name"];
echo '<br/>';

for($i = 0; $i < $numResults; $i++){
if ($all_results[$i]["sys_name"] == $all_results[$j]["sys_name"]){
echo 'Role: ' . $all_results[$i]["role_name"];
echo '<br/>';
$control++;
}
}
echo '<br/>';
}
$j++;
}

Благодаря @ADyson, смотрите первый комментарий для отличного руководства.$ Control - это то, как я реализовал предложение

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