如何使用Laravel Eloquent或SQL查询获取两个用户共有的Inbox记录(禁止使用JOIN)
解决方案:获取两个用户共有的Inbox记录(禁止使用JOIN)
没问题,我来帮你搞定这个需求!你要找出用户123和124共有的inboxid,还不能用JOIN,下面分别用基础SQL和Laravel Eloquent两种方式实现,完全匹配你要的输出格式:
基础SQL实现
思路很简单:先筛选出属于这两个用户的所有记录,按inboxid分组,然后只保留那些分组后包含两个不同用户的记录,最后用CASE语句把两个用户ID分别映射到指定的列中。
SELECT inboxid, MAX(CASE WHEN user_id = 123 THEN user_id END) AS p_user_id, MAX(CASE WHEN user_id = 124 THEN user_id END) AS s_user_id FROM inbox WHERE user_id IN (123, 124) GROUP BY inboxid HAVING COUNT(DISTINCT user_id) = 2;
代码解释
WHERE user_id IN (123, 124):先缩小范围,只处理目标用户的记录GROUP BY inboxid:把同一个inbox的记录归为一组HAVING COUNT(DISTINCT user_id) = 2:确保这个inbox同时属于两个用户(避免同一个用户重复拥有的情况)MAX(CASE ...):因为每个分组里每个CASE只会返回一个非空值,用MAX可以精准提取出对应的用户ID到指定列
Laravel Eloquent实现
用Laravel的查询构造器可以直接对应上面的SQL逻辑,这里提供两种写法,第二种是更安全的参数绑定方式,避免SQL注入风险:
写法1:直接拼接参数(适合固定值场景)
$primaryUserId = 123; $secondaryUserId = 124; $sharedInboxes = DB::table('inbox') ->select([ 'inboxid', DB::raw('MAX(CASE WHEN user_id = ' . $primaryUserId . ' THEN user_id END) AS p_user_id'), DB::raw('MAX(CASE WHEN user_id = ' . $secondaryUserId . ' THEN user_id END) AS s_user_id') ]) ->whereIn('user_id', [$primaryUserId, $secondaryUserId]) ->groupBy('inboxid') ->havingRaw('COUNT(DISTINCT user_id) = 2') ->get();
写法2:参数绑定(适合动态用户ID场景)
$primaryUserId = 123; $secondaryUserId = 124; $sharedInboxes = DB::table('inbox') ->select([ 'inboxid', DB::raw('MAX(CASE WHEN user_id = ? THEN user_id END) AS p_user_id'), DB::raw('MAX(CASE WHEN user_id = ? THEN user_id END) AS s_user_id') ]) ->whereIn('user_id', [$primaryUserId, $secondaryUserId]) ->groupBy('inboxid') ->havingRaw('COUNT(DISTINCT user_id) = ?', [2]) ->setBindings([$primaryUserId, $secondaryUserId, 2]) ->get();
代码解释
DB::raw():用来处理SQL中的CASE语句,因为Eloquent的select方法默认不支持这种复杂表达式whereIn():对应SQL中的WHERE IN条件groupBy()和havingRaw():对应SQL中的分组和筛选逻辑- 参数绑定写法:把动态值用
?占位,最后通过setBindings()传入,更安全可靠
内容的提问来源于stack exchange,提问作者Lonare
相关产品推荐
相关产品推荐

