Laravel Query Builder Join 子句忽略 orderBy()

Laravel Query Builder Join clause is ignoring orderBy()

我正在使用 Laravel 查询构建器,我想问一下,如果返回了很多行,如何指定左连接使用哪一行?

我有这样的代码:

$builder->leftJoin('table2', function (JoinClause $join) {
    $join->on('table2.id', '=', "table1.id")
         ->on('table2.region', '=', "table1.region")
         ->orderBy('table2.updatedAt', 'DESC') // This is being ignored.
         ->limit(1);

});

$join->on()->on() returns 部分有多行,所以我需要指定左连接使用哪一行。我虽然可以按 table2.updatedAt 对其进行排序,然后它将第一行用于左连接。但它完全忽略了 orderBy。所以我不知道如何获得一个特定的行。

编辑: 也有可能来自 table2 的某些行具有完全相同的 table2.updatedAt。在那种情况下,选择具有相同 table2.updatedAt 的哪个并不重要。

检查 laravel 中的查询,我发现应用 ORDER BY 不会对查询应用任何子句。

阅读您的要求,您希望针对指定的条件获得具有最大 updatedAt 字段的记录。如果允许,我个人会在视图中选择 MAX() 查询,但是 views 可以被组织限制或不使用,并且很高兴知道如何根据您的问题进行操作,加上它意味着您不必保持视图。或者,您可以在子查询中执行 MAX(),但这需要更多设置。

首先,您在需要的字段上进行内部联接。其次,您执行左联接以在该联接中查找大于您想要 MAX 的值的值。所以我们想要最新的 updatedAt 字段。最后,你 WHERE 最大的 updatedAt 值没有比它大的值,所以它是真正的最大值:那个值是 NULL.

代码在没有 leftJoin 子句对象的情况下重新混合,我到处传递你的构建器。我看不到您查询的其余部分,但我认为这应该直接插入,因为最多只有 2 个表,即 table2。如果您在 WHERE 子句中提供 1 table.id,您将返回 1 行。

更新:您需要对 ID 执行相同的操作,因此如果您有 2 个具有相同时间戳的日期时间,则选择 ID 较高的一个:

    $sql->join('table2', function ($sql) {
        $sql->on('table2.id', '=', "table1.id")
            ->on('table2.region', '=', "table1.region");
    });

    $builder->leftJoin('table2 AS biggerThanUpdatedAt', function ($builder) {
        $builder->on('table2.id', '=', "biggerThanUpdatedAt.id")
            ->on('table2.region', '=', "biggerThanUpdatedAt.region")
            ->on('table2.updatedAt', '<', 'biggerThanUpdatedAt.updatedAt');
    });

    $builder->leftJoin('table2 AS biggerThanId', function ($builder) {
        $builder->on('table2.id', '<', "biggerThanId.id") //<-notice the greater at is here this time.
            ->on('table2.region', '=', "biggerThanId.region")
            ->on('table2.updatedAt', '=', 'biggerThanId.updatedAt');
    });

    $builder->whereNull('biggerThanUpdatedAt.updatedAt');
    $builder->whereNull('biggerThanId.id');