Php DQL复杂查询

Php DQL复杂查询,php,sql,symfony,doctrine-orm,dql,Php,Sql,Symfony,Doctrine Orm,Dql,好的,我有两个表,相关结构如下: **youtubevideo** id - int allViews - relational **views** id - int youtubevideo_id - int viewCount - int firstFetch - date youtubevideo有很多观点是相关的。这是由Symfony实体中的OneToMany提供的 现在,我有两个约会,让我们分别称之为fromDate和toDate。我需要选择所有youtubevideos,并根据

好的,我有两个表,相关结构如下:

**youtubevideo**
id - int
allViews - relational


**views**
id - int
youtubevideo_id - int
viewCount - int
firstFetch - date
youtubevideo有很多观点是相关的。这是由Symfony实体中的OneToMany提供的

现在,我有两个约会,让我们分别称之为fromDate和toDate。我需要选择所有youtubevideos,并根据属于它们的视图的viewCount和对它们进行排序

我只想使用第一次获取日期在fromDate和toDate之间的视图

所以我想应该是这样的

SELECT y FROM YTScraperBundle:YouTubeVideo y 
JOIN y.allViews v GROUP BY y.id 
ORDER BY SUM(v.viewCount) LIMIT 0, 30; <-- or does this need to be an inline select to the specific element?
获取错误:

Expected known function, got 'IF'

您必须将
一起使用,在之间使用
,并将两个
日期时间
对象绑定到参数化查询中:

$result = $this->getDoctrine()->getManager()->createQuery('
    SELECT y, 
        CASE WHEN (v IS NULL) THEN 0 ELSE SUM(v.viewCount) END AS HIDDEN sumviewcount
    FROM YTScraperBundle:YouTubeVideo y 
    LEFT JOIN y.allViews v WITH v.firstFetch BETWEEN :fromDate AND :toDate
    GROUP BY y ORDER BY sumviewcount DESC
')->setParameter('fromDate', new \DateTime('12-34-5678 00:00:00')) // Replace this with an ISO date
->setParameter('toDate', new \DateTime('12-34-5678 00:00:00')) // Replace here too
->getResult();

我有。他的
隐藏
想法值得称赞。

对于排序,您可以使用
隐藏
Doctrine2功能(从Doctrine2.2+开始提供)

看看这篇文章


希望此帮助

由于某些原因,此仅返回一行抱歉,我的伪代码请尝试删除
distinct
语句或添加
group by y
谢谢!这适用于视图,现在我将尝试实现BETWEEN子句:)!对于date between子句,您可以使用@sjagr答案中的一个,您在我的解决方案中做了哪些更改以使其工作?所以我会把它修好…:)选择y,SUM(v.viewCount)作为YTScraperBundle中隐藏的sumviewcount:YouTubeVideo y JOIN y.allViews v group by y ORDER by sumviewcount DESCI对此返回的1行有问题,而且,即使youtubevideos关联了0个视图,它仍应获得youtubevideos,视图不应附加到它,如果这有意义:)@IvanRistic让我们先解决0视图问题,看看它是否解决了0行问题<代码>连接
默认为
内部连接
,因此我们必须显式调用
左连接
。请参阅我的编辑。请注意,
v.viewCount
在空连接上将是
NULL
,因此这可能会产生另一个问题…现在我遇到一个非常奇怪的问题,排序行为非常奇怪,不起作用,日期不过滤:$query=$this->em->createQuery(“选择y,SUM(v.viewCount))作为YTScraperBundle中的隐藏sumviewcount:YouTubeVideo y LEFT JOIN y.allViews v WITH v.firstFetch Before:fromDate AND:toDate按y顺序分组按sumviewcount说明“@IvanRistic使用您的完整代码更新您的问题,包括
setParameter
函数。我已经对我的答案进行了编辑,以处理
y的
NULL
值。。。试试看,但这并不能解决所有问题(过时:)谢谢你的帮助
$result = $this->getDoctrine()->getManager()->createQuery('
    SELECT y, 
        CASE WHEN (v IS NULL) THEN 0 ELSE SUM(v.viewCount) END AS HIDDEN sumviewcount
    FROM YTScraperBundle:YouTubeVideo y 
    LEFT JOIN y.allViews v WITH v.firstFetch BETWEEN :fromDate AND :toDate
    GROUP BY y ORDER BY sumviewcount DESC
')->setParameter('fromDate', new \DateTime('12-34-5678 00:00:00')) // Replace this with an ISO date
->setParameter('toDate', new \DateTime('12-34-5678 00:00:00')) // Replace here too
->getResult();
SELECT y, 
       SUM(v.viewCount) AS HIDDEN sumviewcount 
FROM YTScraperBundle:YouTubeVideo y 
JOIN y.allViews v  
GROUP BY y
ORDER BY sumviewcount 
LIMIT 0, 30;