PHP / MYSQL Запрос для группировки по другому массиву - PullRequest
1 голос
/ 26 мая 2020

Моя сегодняшняя потребность, и я надеюсь, вы найдете отличное решение, заключается в следующем. У меня есть таблица БД с задачами, каждая из которых имеет статус «открыто» или «закрыто». В моем случае у меня есть только записи с открытыми задачами.

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

Array (
  [open] => Attay(task1), Array(task2),..
  [closed] => Array()  
)

Если я сделаю запрос sql:

select task_id,status from tasks group by status

, я получу только задачи внутри «open». Как лучше всего создать массив состояний и «добавить» в каждую из них задачи с этим статусом?

заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 29 мая 2020

Спасибо всем за вклад.

Я решил таким образом.

  $statusArray = ['opened', 'wait_others', 'wait_us', 'closed'];
  foreach ($statusArray as $status) {
    $ticketsArray[$status]= array();
  }
  foreach ($row as $key => $value) {
    $ticketsArray[$value->status_title][$value->ticket_id]= $row[$key];
  }
  print"<pre>";print_r($ticketsArray);
0 голосов
/ 26 мая 2020

В чистом SQL вы можете создать производную таблицу статусов с помощью union all, а затем перенести исходную таблицу с left join:

select
    s.status,
    json_arrayagg(t.task_id) json_task_ids
from (
    select 'open' status
    union all select 'closed' status
) s
left join tasks t on t.status = s.status
group by s.status

MySQL не имеет array тип данных, поэтому список идентификаторов задач отображается в виде массива json. Другой вариант - создать списки, разделенные запятыми: для этого вы можете использовать group_concat():

select
    s.status,
    group_concat(t.task_id) csv_task_ids
from (
    select 'open' status
    union all select 'closed' status
) s
left join tasks t on t.status = s.status
group by s.status
0 голосов
/ 26 мая 2020

Можно попробовать что-то вроде этого

$sql = "SELECT task_id, status FROM tasks";

$status['open'], status['close'] = [];

while( $row = $result->fetch_assoc() ) {

    if ($row['status'] == 'open') {
        array_push($status['open'], $row['task_id']);
    }

    if ($row['status'] == 'close') {
        array_push($status['close'], $row['task_id']);
    }
}

print_r($status);
0 голосов
/ 26 мая 2020

Вы можете использовать GROUP_CONCAT, чтобы собрать все задачи для каждого статуса в список, разделенный запятыми, а затем explode в массив в PHP. Предполагая, что вы используете mysqli и ваше соединение находится в $conn, вы должны сделать что-то вроде этого:

$sql = "SELECT status, GROUP_CONCAT(task_id) AS taskids FROM tasks GROUP BY status";
$result = $conn->query($sql);
$output = array();
while ($row = $result->fetch_assoc()) {
    $output[$row['status']] = explode(',', $row['taskids']);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...