我想从具有特定商品的所有订单中选择订单商品.在SQL中我会这样做:
SELECT DISTINCT i.id, i.name, order.name
FROM items i
JOIN orders o ON i.order_id=o.id
WHERE o.id IN (
SELECT o2.id FROM orders o2
JOIN items i2 ON i2.order_id=o2.id AND i2.id=5
)
AND i.id != 5
ORDER BY o.orderdate DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
如何使用查询构建器执行此查询?
我想选择没有特定服务的会员.我有3张桌子:
membreservicemembre_service(membre和之间的关系service)我正在使用doctrine 2,在SQL中我的查询是:
SELECT m.* FROM membre m WHERE m.`id` NOT IN (
SELECT ms.membre_id FROM membre_service ms WHERE ms.service_id != 29
)
Run Code Online (Sandbox Code Playgroud)
在Doctrine,我做:
$qb = $this->_em->createQueryBuilder();
$qb2 = $qb;
$qb2->select('m.id')
->from('Custom\Entity\MembreService', 'ms')
->leftJoin('ms.membre', 'm')
->where('ms.id != ?1')
->setParameter(1, $service);
$qb = $this->_em->createQueryBuilder();
$qb->select('m')
->from('Custom\Entity\Membre', 'm')
->where($qb->expr()->notIn('m.id', $qb2->getDQL())
);
$query = $qb->getQuery();
//$query->useResultCache(true, 1200, __FUNCTION__);
return $query->getResult();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
语义错误]第0行,第123页'm WHERE ms.id'附近:错误:'m'已经定义.
我需要限制LEFT JOIN结果,所以我必须使用子查询.有人可以给我建议如何用Doctrine 2做到这一点?
我现在拥有的是:
$qb = $this->_em->createQueryBuilder();
return $qb->add('select', 'c,j')
->add('from', 'JobeetBundle:Category c')
->leftJoin('c.jobs', 'j', 'WITH', 'j.category = c')
->add('where', 'j.expiresAt > ?1')
->add('orderBy','j.expiresAt DESC')
->setParameter(1, new \DateTime())
->getQuery()
->getResult();
Run Code Online (Sandbox Code Playgroud)
但我必须改变它,将每个类别的工作结果限制在10.
我有一个DQL,如下所示:
SELECT at, count(at.id) FROM AccountTriple at JOIN at.property p JOIN at.account ac WHERE p.create_analytics = '1' GROUP BY at.property, at.value, ac.service
Run Code Online (Sandbox Code Playgroud)
如您所见,它具有三个联接。由于“ at”和“ ac”都具有大量数据。为了优化它,我尝试在连接到“ ac”之前移动“ p.create_analytics ='1'”检查,以便为它提供一个较小的要连接的数据集。我正在尝试实现以下目标:
SELECT at, count(at.id) FROM ( SELECT at FROM AccountTriple at JOIN at.property p WHERE p.create_analytics = '1' ) JOIN at.account ac GROUP BY at.property, at.value, ac.service
Run Code Online (Sandbox Code Playgroud)
但是以某种方式,我的语法不起作用。错误消息如下所示:
语义错误]行0,第29行靠近'((在FROM处的选择):错误:类'('未定义。
在其他任何地方也找不到类似的示例。有谁能帮助修复此DQL查询以使其正常工作?提前致谢。
我正在尝试使用Doctrine进行子查询的查询.现在它给了我一个错误.我在存储库中的功能是:
public function getRecentPlaylists($count = 3) {
$q = $this->_em->createQuery("
SELECT p.id,
p.featuredImage,
p.title,
p.slug,
a.firstName,
a.lastName,
a.slug as authorSlug,
(SELECT updated
FROM \Entities\Articles
ORDER BY updated DESC LIMIT 1) as updated
FROM \Entities\Playlist p
JOIN \Entities\Account a
ON p.account_id = a.id
")
->setMaxResults($count);
try{
return $q->getResult();
}catch(Exception $e){
echo $e->message();
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我这个错误:
[Semantical Error] line 0, col 210 near 'LIMIT 1) as updated FROM': Error: Class 'LIMIT' is not defined.
Run Code Online (Sandbox Code Playgroud)
我几乎放弃了Doctrine,我无法弄清楚如何使用子查询或带有子查询的联合进行查询.有什么帮助这个功能?谢谢!