You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:22:48