Как получить один внешний ключ данных только один раз? - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу получить данные обо всех сообщениях, отправленных конкретной команде, но я хочу получить только первый экземпляр внешнего ключа и не хочу повторять это снова.Например, я хочу только первую строку с конкретным идентификатором команды и не хочу повторять строку с тем же внешним ключом снова.Только хотите перечислить данные с уникальными внешними ключами.Следующий запрос работает хорошо, но он повторяет team_id, но я хочу один идентификатор команды только один раз.Это запрос.

  $pages = DB::table('teams')
    ->leftJoin('conversation_teams', 'teams.id', '=', 'conversation_teams.team_id')
    ->select('teams.name','conversation_teams.id','conversation_teams.message_body','conversation_teams.sender_user_id','conversation_teams.receiver_user_id','conversation_teams.created_at','conversation_teams.team_id')
    ->whereIn('conversation_teams.team_id',$my_teams)
    ->orderBy('conversation_teams.created_at', 'DESC')
    ->paginate(12);

Это структура таблицы. таблица цепочек разговоров

enter image description here

1 Ответ

0 голосов
/ 05 февраля 2019

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

Временное решение - отключить mysql only_full_group_by option.

Однако, не делая этого, я бы сделал длинный шаг, добавив соединение с подзапросом:

$pages = DB::table('teams')
    ->leftJoin('conversation_teams', 'teams.id', '=', 'conversation_teams.team_id')
    ->join(DB::raw("(SELECT 
      MIN(id) as d_id, team_id as t_id
      FROM conversation_teams
      GROUP BY t_id
      ) as ct_derived"),function($join){
        $join->on("conversation_teams.id","=","ct_derived.d_id");
    })
    ->select('teams.name','conversation_teams.id','conversation_teams.message_body','conversation_teams.sender_user_id','conversation_teams.receiver_user_id','conversation_teams.created_at','conversation_teams.team_id')
    ->whereIn('conversation_teams.team_id',$my_teams)
    ->orderBy('conversation_teams.created_at', 'DESC')
    ->paginate(12);

У меня нет таблицы для запуска запроса, но я пытаюсь сделатьэто я фильтрую результаты conversation_teams и беру первую запись на команду, что вам и нужно, если я правильно понимаю.

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