Mysql laravel中具有联接的子查询
我快要为一个查询发狂了,有人能帮我翻译一个查询,用laravel工作,或者用laravel的方式写作吗 下面是查询代码,它使用的是MySQL 我被卡住的部分是第一个连接子查询到另一个连接它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
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的方法是定义您的所有模型和关系,并使用雄辩的语言。所有模型和关系都是建立的。我在我系统的其他位置使用它我尝试了这个选项,但出于某种原因,它过滤了一些结果,由于我的预计到达时间,我不知道为什么。所以我使用了原始查询。非常感谢。