如何使用 LEFT JOIN 查询将 RAW SQL 转换为 DQL
Posted
技术标签:
【中文标题】如何使用 LEFT JOIN 查询将 RAW SQL 转换为 DQL【英文标题】:How to transform RAW SQL to DQL with query on LEFT JOIN 【发布时间】:2017-02-11 02:09:37 【问题描述】:我遇到了一个小问题...我创建了一个运行良好的 SQL 查询。
我需要一个关于查询结果的列,它告诉我该行是否存在于另一行中,并按 user_id 分组。
这是我现在的查询:
select u.*,
case when m.usuario_id = u.id
then 1
else 0
end as posicionado
from usuario u
left join ( select usuario_id from matriz where matriz = 1 ) as m
on u.id = m.usuario_id group by u.id
但是当我尝试转换做 DQL 时,left join ( select
出现问题。
这是我的实际 DQL:
SELECT u,
CASE WHEN IDENTITY(m.usuario) = u.id
THEN 1
ELSE 0
END AS posicionado
FROM AppBundle:Usuario u
LEFT JOIN (SELECT IDENTITY (ma.usuario_id) FROM AppBundle:Matriz ma WHERE ma.matriz = 1) as m ON u.id = m.usuario_id group by u.id
看起来好像 Doctrine 无法理解该查询。这是错误:
[语义错误] line 0, col 206 near '(SELECT IDENTITY(ma.usuario_id)':错误:未定义类 '('。
有人可以帮助我了解如何在 JOIN 上使用查询与 Doctrine 吗? 我需要它与 KNPPaginationBundle 一起使用。它不适用于原始 SQL。
【问题讨论】:
【参考方案1】:尽量不要使用Identity
函数。你不需要它,因为你是从 Matriz 中选择的。但我仍然会删除内部选择并使用如下:
SELECT u,
CASE WHEN IDENTITY(m.usuario) = u.id
THEN 1
ELSE 0
END AS posicionado
FROM AppBundle:Usuario u
LEFT JOIN AppBundle:Matriz ma ON ma.matriz = 1 AND m.usario_id = u.id
group by u.id
另外,如果您展示您的实体,我可以改进连接。
【讨论】:
以上是关于如何使用 LEFT JOIN 查询将 RAW SQL 转换为 DQL的主要内容,如果未能解决你的问题,请参考以下文章
sql inner join 与 left join和right join 执行效率上面有多大差别?
关于SQL 查询效率问题 left join 改成 inner join union