【问题标题】:Create subquery in NOT IN在 NOT IN 中创建子查询
【发布时间】:2021-02-25 19:01:25
【问题描述】:

我正在使用Laravel Framework 6.16.0

我有以下 sql 查询:

SELECT DISTINCT
    `companies`.*
FROM
    `companies`
LEFT JOIN `trx` ON `trx`.`companies_id` = `companies`.`id`
WHERE
    `trx`.`transaction_date` >= 2020-11-12 AND companies.symbol NOT IN (SELECT DISTINCT
        companies.symbol
    FROM
        `companies`
    LEFT JOIN articles a ON a.companies_id = companies.id
    WHERE
        a.created_at >= 2020-11-12 
    ORDER BY
        created_at
    DESC)
ORDER BY
    transaction_date
DESC
    

我创建了以下雄辩的查询:

    DB::connection('mysql_prod')->table('companies')->select('companies.symbol')
                ->leftJoin('trx', 'trx.companies_id', '=', 'companies.id')
                ->where('trx.transaction_date', '>=', Carbon::today()->subDays(1)->startOfDay())
                ->orderBy('transaction_date', 'desc')
                ->distinct()
                ->get('symbol');

但是,我不确定如何在我的 eloquent 查询中打包以获取所有应该排除的 symbol

非常感谢您的回复!

【问题讨论】:

  • 既然选择了companies.symbol,是不是还要再提->get('symbol')?我认为->get() 可能有用...
  • 您没有使用 Eloquent,您使用的是查询构建器。如果您在模型之间建立关系并使用 Eloquent,这会容易得多。

标签: php laravel laravel-query-builder


【解决方案1】:

你应该试试这样的:

$date = Carbon::today()->subDays(1)->startOfDay();
DB::connection('mysql_prod')->table('companies')->select('companies.symbol')
                ->leftJoin('trx', 'trx.companies_id', '=', 'companies.id')
                ->where('trx.transaction_date', '>=', $date)
                ->whereNotIn('companies.symbol', function ($q) use ($date) => {
                    $q->select('companies.symbol')
                      ->from('companies')
                      ->leftJoin('articles', 'articles.companies_id', 'companies.id')
                      ->where('articles.created_at', '>', $date)
                      ->distinct()
                      ->get()
                })
                ->orderBy('transaction_date', 'desc')
                ->distinct()
                ->get();

它将提供与您提到的类似的查询。

来自here的参考。

另外,您可以阅读如何从Laravel docs 编写子查询。

检查 this one more good answer 是否有您需要的内容。

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 2023-03-20
    • 2014-03-03
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多