выберите записи с датами, в которых выполняются условия, и сгруппируйте результаты по каждой дате - PullRequest
1 голос
/ 11 марта 2020

У меня есть таблица mysql, как показано ниже:

t_id    project_id  task_id  start_date
---------------------------------------
1        29         1       2020-03-09
2        29         2       2020-02-09
3        1          3       2019-02-20
4        1          4       2019-12-09
5        1          5       2019-12-09

Я хочу показать данные из приведенной выше таблицы так, чтобы все task_id отображались в виде значений, разделенных запятыми, для конкретная дата для конкретного проекта. Допустим, для project_id=1 сначала я перечисляю все даты в start_date, затем я покажу, что задачи с таким же start_date будут перечислены как разделенные запятыми.

Ожидаемый результат:

start_date      task_id
-----------------------
2019-02-20      3
2019-12-09      4,5

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

Контроллер:

$id = $this->uri->segment(4);       
$dates = $this->Timesheet_model->get_tasks_dates($id); //get the dates
foreach($dates as $d)
    {
        $rows = $this->Timesheet_model->get_project_tasks_by_date($id,$d->start_date); //get tasks for each date
            foreach($rows->result() as $res)
            {
                $t[] = $res->task_id;
            }
        $ts = implode(",",$t);
        $tasks = array(
            'date'=>$d->start_date,
            'tasks'=>$ts
        );
    }
    print_r($tasks);

Модель

public function get_tasks_dates($id)
{
    $sql = 'SELECT DISTINCT (start_date) FROM xin_tasks WHERE project_id = ? ORDER BY start_date DESC ';
    $binds = array($id);
    $query = $this->db->query($sql, $binds);

    return $query->result();
}

public function get_project_tasks_by_date($id,$d)
{
    $sql = 'SELECT task_id FROM xin_tasks WHERE project_id = ? AND start_date = ?';
    $binds = array($id,$d);
    $query = $this->db->query($sql, $binds);

    return $query;
}

Когда я пытаюсь print_r($tasks), получается Array ( [date] => 2019-02-20 [tasks] => 4,5,3 ).

Я знаю, что это не сложная проблема, но в настоящее время я не могу найти правильное решение для достижения этой цели. Есть ли другой эффективный способ решить эту проблему?

Ответы [ 2 ]

1 голос
/ 11 марта 2020
SELECT start_date,GROUP_CONCAT(task_id) as task_id
from project
where project_id = 1
group by start_date

Ваша проблема может быть решена с помощью одного запроса.

0 голосов
/ 11 марта 2020

Используйте ключевое слово DISTINCT, если то же самое task_id повторяется в тот же день.

SELECT start_date,GROUP_CONCAT(DISTINCT task_id) as task_id
FROM project
WHERE project_id = 1
GROUP BY start_date;

Если вы используете DISTINCT, мы получим уникальные идентификаторы задачи (ов) ..

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