2015-05-18 70 views
0

我有一个SQL查询,我试图将其转换为DQL。看起来像DQL不喜欢在FROM子句中使用子查询。你能指导我的方向吗?Doctrine查询语言中的子查询

SQL:

select count(x.remote_addr), ipc.country 
from 
(
select distinct(remote_addr) from update_feature_requests ufr 
where ufr.request_datetime BETWEEN '2015-05-14' AND '2015-05-15' 
) 
as x 
join ip_geolocation_cache ipc ON ipc.ip_address = x.remote_addr 
group by ipc.country; 

DQL:

$dql = "select 
      count(x.remoteAddr), ipc.country 
      from 
      (
       select distinct(remoteAddr) from " . UpdateFeatureRequest::class . " ufr 
       where ufr.requestDatetime BETWEEN '2015-05-14' AND '2015-05-15' 
      ) 
      as x 
      join " . IpGeolocationCache::class . " ipc ON ipc.ipAddress = x.remoteAddr 
      group by ipc.country"; 

Doctrine \ ORM \ Query \ QueryException HELP [Semantical Error] line 0, col 82 near '(': Error: Class '(' is not defined.

回答

1

学说确实支持子查询只在有限的方式(如柱,其中,存在等)和可惜的派生表(子查询从)不是其中之一。你必须重新构造完整的查询才能进入dql。

等效的查询可能是沿(SQL版)的东西:

select count(distinct ufr.remote_addr), ipc.country 
from update_feature_requests ufr 
join ip_geolocation_cache ipc ON ipc.ip_address = ufr.remote_addr 
where ufr.request_datetime BETWEEN '2015-05-14' AND '2015-05-15' 
group by ipc.country; 

(应该算每counry这是我看了你的原始查询的唯一地址)

另一种可能性是使用native query

+0

非常感谢,非常感谢。我相信你的sql也应该比我的更快。它应该很容易理解它:-)我会记住Doctrine –

+0

的这种限制不一定要更快:)根据结构,但yor子查询可以物化为简单的索引扫描,MariaDB甚至可以合并将子查询自动地添加到外部查询中(看起来像这个在MySQL 5.6中尚不可用) – jkavalik