任务+参与者:加入n..n并将结果除以组(在1个查询中)

时间:2014-11-25 14:53:14

标签: mysql sql database database-schema

只是一个小的介绍

  1. 任务任务表)
  2. 用户用户表)
  3. 用户可以参与参与不同的任务( task_has_user 表)
  4. 参与者在作者(-s),实干家(-s),检查员(-s)等方面存在分歧。
  5. The data is stored in following schema:

    我想用逗号分隔的参与者获取所有任务的列表,如下所示(数组表示):

    [
      'title' => 'Example task',
      ...
      'authors' => 'Name1 Surname1, Name2 Surname2',
      'doers' => 'Name3 Surname3',
      'checkers' => 'Name4 Surname4'
    ]
    

    一个查询中。

    我认为MySQL CONCAT(GROUP_CONCAT等)功能可以帮助我解决这个问题,但我不确定在这里使用它是否正确。

    请帮助:3

1 个答案:

答案 0 :(得分:0)

在Laravel v4.2中这样做了吗? 查询数= 6 *任务数。很重..但我很快就会改变它。

/**
 * Get the full list of tasks with participants
 * @return array
 */
public static function index() {
  /**
   * All tasks
   * @var array
   */
  $tasks = DB::select("SELECT `title` FROM `task` ");

  /**
   * All roles
   * @var array
   */
  $roles = ['doers', 'checkers', 'authors'];

  foreach ($tasks as &$task)
  {
    foreach ($roles as $role) {
      $sql = "SELECT GROUP_CONCAT(CONCAT_WS(' ', `name`, `surname`) SEPARATOR ', ') AS `$role` FROM `task` ";
      $sql .= "JOIN `task_has_user` ON `idtask` = `task_idtask` ";
      $sql .= "JOIN `user` ON `iduser` = `user_iduser` ";
      $sql .= "WHERE `task_has_user`.`role` = " . (array_search($role, $roles) + 1);

      $task->$role = DB::select($sql)[0]->$role;
    }
  }

  return $tasks;
}