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

如何关联IN子查询结果并筛选dapps表中active=1的记录?

需求实现方案

原生SQL实现

首先明确表关联前提:dapp_tokens表存在dapp_id字段关联dapps表的主键id,新增筛选条件后直接在原来的子查询中关联dapps表过滤即可。

基于IN子查询的写法(和原有逻辑兼容性最高)

SELECT *
FROM tokens
WHERE active = 1
  AND id IN (
    SELECT dt.token_id
    FROM dapp_tokens dt
    INNER JOIN dapps d ON dt.dapp_id = d.id
    WHERE dt.active = 1 AND d.active = 1
  )
ORDER BY market_cap, id DESC
-- 分页参数按实际需求补充
LIMIT [每页数量] OFFSET [偏移量]

性能优化版(WHERE EXISTS写法,大数据量下查询效率更高)

SELECT *
FROM tokens t
WHERE t.active = 1
  AND EXISTS (
    SELECT 1
    FROM dapp_tokens dt
    INNER JOIN dapps d ON dt.dapp_id = d.id
    WHERE dt.token_id = t.id AND dt.active = 1 AND d.active = 1
  )
ORDER BY t.market_cap, t.id DESC

现有Laravel查询代码修改

直接修改原有whereRaw内的子查询即可,改动最小:

$data['tokens'] = Token::where('active', 1)
    ->whereRaw('tokens.id in (select dt.token_id from dapp_tokens dt inner join dapps d on dt.dapp_id = d.id where dt.active = ? and d.active = ?)', [1, 1])
    ->sortable('market_cap')
    ->orderBy('id','desc')
    ->paginate($page_count);

如果要切换为性能更好的whereExists写法,代码如下(需要提前引入DB门面):

use Illuminate\Support\Facades\DB;

$data['tokens'] = Token::where('active', 1)
    ->whereExists(function ($query) {
        $query->select(DB::raw(1))
              ->from('dapp_tokens as dt')
              ->join('dapps as d', 'dt.dapp_id', '=', 'd.id')
              ->whereColumn('dt.token_id', 'tokens.id')
              ->where('dt.active', 1)
              ->where('d.active', 1);
    })
    ->sortable('market_cap')
    ->orderBy('id','desc')
    ->paginate($page_count);

内容的提问来源于stack exchange,提问作者Dapp Future

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:24:03