如何使用 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 执行效率上面有多大差别?

left join 如何三表查询

关于SQL 查询效率问题 left join 改成 inner join union

如何使用 LEFT JOIN 创建 JPA NamedQuery

如何在 SQL 中使用多个 LEFT JOIN?

如何在 Teradata SQL 中使用 LEFT JOIN 对查询中的非聚合参数进行 GROUP BY?