Mysql laravel中具有联接的子查询

Mysql laravel中具有联接的子查询,mysql,sql,laravel,join,subquery,Mysql,Sql,Laravel,Join,Subquery,我快要为一个查询发狂了,有人能帮我翻译一个查询,用laravel工作,或者用laravel的方式写作吗 下面是查询代码,它使用的是MySQL 我被卡住的部分是第一个连接子查询到另一个连接它 SELECT usr.token, usr.id, usr.username, usr.sn, usr.givenname, usr.telefone_numero, usr.active, usr.unidade_id, usr.di

我快要为一个查询发狂了,有人能帮我翻译一个查询,用laravel工作,或者用laravel的方式写作吗

下面是查询代码,它使用的是MySQL

我被卡住的部分是第一个连接子查询到另一个连接它

SELECT 
    usr.token,
    usr.id,
    usr.username,
    usr.sn,
    usr.givenname,
    usr.telefone_numero,
    usr.active,
    usr.unidade_id,
    usr.divisao_id,
    usr.secao_id,
    clients.nick,
    posto_grad.sigla AS quadro_sigla,
    log_logradouro_complemento,
    log_logr.nome AS log_logradouro_nome,
    log_logr.cep AS log_logradouro_cep,
    log_bairro.nome AS log_bairro_nome,
    log_localidade.nome AS log_localidade_nome,
    log_uf.sigla AS log_uf_sigla
FROM
    users usr
        LEFT JOIN
    (SELECT 
        usr_log1.*
    FROM
        users_log_logradouro AS usr_log1
    LEFT JOIN users_log_logradouro AS usr_log2 ON usr_log1.user_id = usr_log2.user_id
        AND usr_log1.created_at < usr_log2.created_at
    WHERE
        usr_log2.user_id IS NULL) AS temp ON (usr.id = temp.user_id)
        LEFT JOIN
    log_logradouro log_logr ON temp.log_logradouro_id = log_logr.id
        INNER JOIN
    clients ON clients.matricula = usr.givenname
        INNER JOIN
    quadro ON quadro.id = clients.quadro_id
        INNER JOIN
    posto_graduacao posto_grad ON posto_grad.id = clients.posto_graduacao_id
        LEFT JOIN
    log_bairro ON log_logr.log_bairro_id = log_bairro.id
        LEFT JOIN
    log_localidade ON log_bairro.log_localidade_id = log_localidade.id
        LEFT JOIN
    log_uf ON log_localidade.log_uf_sigla = log_uf.sigla
WHERE
    usr.departmentnumber IN (1,2,3,4)

尝试将子查询作为原始表达式作为leftJoin方法中的第一个参数发送,例如:

$subquery = '(SELECT 
                    usr_log1.*
                FROM
                    users_log_logradouro AS usr_log1
                LEFT JOIN 
                    users_log_logradouro AS usr_log2 
                    ON usr_log1.user_id = usr_log2.user_id
                    AND usr_log1.created_at < usr_log2.created_at
                WHERE
                    usr_log2.user_id IS NULL) 
                AS temp';

    DB::table('users as usr')
        ->select(...)
        ->leftJoin(DB::raw($subquery), 'usr.id', '=', 'temp.user_id')
        ->leftJoin(...)
        ->join(...)
        ->join(...)
        ->join(...)
        ->leftJoin(...)
        ->leftJoin(...)
        ->leftJoin(...)
        ->where(...)
        ->get()
这些问题中有类似的例子:

更多信息abaut加入:

感谢所有回答的用户,经过几次测试后,我选择将DB::table与原始查询一起使用,效果非常好

谢谢大家。

您可以试试我专为这个案子设计的手机

在你的样品中是

User::selectRaw(....)
->leftJoinSubquery(UserLogs::where(...)->leftJoin(...),
    'temp', 
    function ($join) {
        $join->on('users.id', '=', 'temp.user_id');
    }
)

为什么不使用laravel插入原始查询?如果不打算使用其他数据库类型,可以使用DB::raw,只使用原始SQL查询。节省您分配的工作。Laravel的方法是定义您的所有模型和关系,并使用雄辩的语言。所有模型和关系都是建立的。我在我系统的其他位置使用它我尝试了这个选项,但出于某种原因,它过滤了一些结果,由于我的预计到达时间,我不知道为什么。所以我使用了原始查询。非常感谢。