我想获取发送给特定团队的所有消息的数据,但是我只想获取外键的第一个实例,并且不想再次重复。例如,我只希望特定团队ID的第一行,并且不想再次使用相同的外键重复该行。只想使用唯一的外键列出数据。以下查询效果很好,但是它重复了team_id,但我只希望一个团队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);
这是表结构。 table of conversation_teams
答案 0 :(得分:0)
使用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
结果,并获取每支团队的第一条记录,如果我正确理解的话,这就是你想要的。 / p>