mysql - 在 Symfony 中根据日期和 count() 获取 mysql 结果

标签 mysql sql symfony

在这种情况下我有 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/

相关文章:

php - Symfony2 : Routing ignores port in URL

php - 在php sql语句中动态更改偏移量

php - PDO 语句可能不正确

php - 在php中获取当前数据

sql - 我的 SQL Server 存储过程中的 BIT 值类型存在语法问题

php - Symfony 2 Forms实体字段类型分组

php - 使用 composer 安装库而不更新 composer.json 上当前库的版本

php - mysql WHERE子句为空时,返回所有行

mysql - Mariadb except 语句错误

mysql - SQL查询帮助: update table values with data from two other tables