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;