在这种情况下我有 4 个相关表
用户
-用户名
集团成员
-用户名 -groupId
发布
-groupId -创建日期
后冲
-用户名 -postId
我想创建一个函数 getTrendingPosts($user_id, $date),其中 $user_id 是当前用户,$date 是距当前日期有多远,我想包含结果。
所以思路是
首先获取用户所在的组
其次获取我们为用户找到的组中且在时间范围内的帖子
根据 postbumps 的 count() 对这些帖子进行第三次排序
前两位我会,但我真的不知道如何做第三位。同时,如果可以在 2 甚至 1 中完成,我不想使用 3 个查询。
对于第一个,(返回包含 id 的组实体)
public function getGroupsIdByUserId($user_id){
$qb=$this->repository->createQueryBuilder('x');
$qb->select('AppBundle:GroupMember');
$qb->where('x.userId = :userId');
$qb->setParameter('userId',$user_id);
return $qb->getQuery()->getResult();
}
对于第二个(我最终为每个组 ID 调用它,尽管我试图一次获得它)
public function getPosts($group_id, $date){
$qb=$this->repository->createQueryBuilder('x');
$qb->select('AppBundle:Post');
$qb->where('x.dateCreated < :dateCreated AND x.groupId = :groupId');
$qb->setParameter('dateCreated',$date);
$qb->setParameter('groupId', $group_id);
return $qb->getQuery()->getResult();
}
查询是通过 symfony 使用查询构建器函数完成的,尽管我更关心查询的实际逻辑,所以即使是纯 SQL 的答案也足够好。
最佳答案
所以你想要的基本 SQL 是这样的:
SELECT COUNT(POSTBUMP.postId)
FROM post
INNER JOIN POSTBUMP ON POSTBUMP.postId = postID AND userID = 1
WHERE datecreated < '2017-01-01' AND
groupID IN (SELECT groupid FROM groupmember WHERE userid = 1)
ORDER BY COUNT(POSTBUMP.postId) DESC
要在一个函数中实现这一点,您可以这样做:
public function getTrendingPosts($user_id, $date){
$em = $this->container->get('doctrine.orm.entity_manager');
$qb2 = $em->getRepository('AppBundle:GroupMember')->createQueryBuilder('o2');
$qb=$em->createQueryBuilder('x');
$qb->select('count(o.postId), o.postId')
->from('AppBundle:Post')
->innerJoin('AppBundle:PostBump', 'o', 'WITH', 'o.userId = :userId AND o.postId = x.postId')
->where('x.dateCreated < :dateCreated')
->andWhere($qb->expr()->in(
'x.groupid',
$qb2->select('o2.groupid')
->where('o2.userid = :userId')
->getDQL()
))
->setParameter('dateCreated',$date)
->setParameter('userId',$user_id)
->addGroupBy('count(o.postId), o.postId')
->addOrderBy('count(o.postId)', 'DESC')
;
return $qb->getQuery()->getResult();
}
我还没有测试过这段代码,所以让我知道它是否可以修改/不修改。
关于mysql - 在 Symfony 中根据日期和 count() 获取 mysql 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42962294/