如何将数据库中的条目平均分为5个?

时间:2014-05-22 08:03:27

标签: mysql sql symfony doctrine-orm

我有一个名为Shops的桌子,我想把这个Shop条目划分为5.我的桌子上有80k条目,我希望用户A可以访问16k的第一家商店,用户B可以访问下一个16k商店等等等我知道我可以使用限制,但Shop的主键/ ID不是顺序的。

目前我的查询如下:

if (in_array("ADMIN1", $userRoles)) {
            $lowerLimit = 0;
            $upperLimit = $numberOfProspectiveShops/5;
        } else if (in_array("ADMIN2", $userRoles)) {
            $lowerLimit = $numberOfProspectiveShops/5;
            $upperLimit = ($numberOfProspectiveShops/5) * 2;
        } else if (in_array("ADMIN3", $userRoles)) {
            $lowerLimit = ($numberOfProspectiveShops/5) * 2;
            $upperLimit = ($numberOfProspectiveShops/5) * 3;
        } else if (in_array("ADMIN4", $userRoles)) {
            $lowerLimit = ($numberOfProspectiveShops/5) * 3;
            $upperLimit = ($numberOfProspectiveShops/5) * 4;
        } else if (in_array("ADMIN5", $userRoles)) {
            $lowerLimit = ($numberOfProspectiveShops/5) * 4;
            $upperLimit = $numberOfProspectiveShops;
        }


        $prospectiveShopsQuery = $em->createQueryBuilder()->select('s')
                ->from("AppMainBundle:ProspectiveShop", 's')
                ->andWhere('s.id <= :upperLimit')  
                ->setParameter('upperLimit', $upperLimit)
                ->andWhere('s.id > :lowerLimit')  
                ->setParameter('lowerLimit', $lowerLimit)
                ->andWhere('s.status IS NULL')  
            ;

1 个答案:

答案 0 :(得分:1)

您应该使用mySQL的“限制”功能,而不是基于id的where子句。

这可以通过使用setFirstResult($ offset)和setMaxResults($ limit)来实现。 对于前5000,偏移应该等于0并且限制为5000,然后接下来的5000偏移= 5000和限制5000

您的查询构建器应如下所示:

$prospectiveShopsQuery = $em->createQueryBuilder()->select('s')
            ->from("AppMainBundle:ProspectiveShop", 's')
            ->andWhere('s.status IS NULL')  
            ->setFirstResult($offset)  
            ->setMaxResults($limit)  
        ;