我想获取发送到特定团队的所有消息的数据,但我想只有一个外键的第一个实例,并且不想再重复了。例如,我要一个特定团队的ID只有第一排不想再重复同样与外键的行。只想列出具有独特foriegn密钥数据。下面的查询工作得很好,但它的重复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
用最小的简单组()会帮助你,但是,你必须在选择列表非聚合列,不会让查询执行。
解决方法是禁用的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
结果,并采取每队的第一个记录这是你想要什么,如果我的理解是正确的表格。