【问题标题】:how to get random entry from db?如何从数据库中获取随机条目?
【发布时间】:2020-12-24 20:31:31
【问题描述】:

我需要从数据库中获取随机记录。我是怎么做的:

$qb = $this->createQueryBuilder('article');
$totalRowsTable = $qb->select('count(article.id)')->getQuery()->getSingleScalarResult();
var_dump($totalRowsTable);

$random = (int)max(0, rand(1, $totalRowsTable));
var_dump($random);

$qb = $this->createQueryBuilder('article')
     ->andWhere("article.id IN (:id)")
     ->setParameter('id', $random)
     ->setMaxResult(1);
return $qb->getQuery()->getResult();

我不明白为什么函数返回零。如何以更正确的方式从数据库中获取随机记录?

【问题讨论】:

  • 这能回答你的问题吗? Best way to select random rows PostgreSQL
  • 条目数不一定与您的数据行的 ID 匹配。即您的行 ID 可以从 10000 开始,但您只有 50 个条目。那时你永远不会得到结果。

标签: php postgresql doctrine-orm


【解决方案1】:
$idArticle = $this->createQueryBuilder('article')
            ->select('MIN(article.id)', 'MAX(article.id)')
            ->getQuery()
            ->getOneOrNullResult();
        $random = rand($idArticle[1], $idArticle[2]);

        return $this->createQueryBuilder('article')
            ->where('article.id >= :randomId')
            ->setParameter('randomId', $random)
            ->setMaxResults(1)
            ->getQuery()
            ->getResult();

【讨论】:

    【解决方案2】:

    我认为这可能是您问题的正确答案。

    首先我们必须通过执行以下代码来计算表中的行数:

    $queryBuilder = $this->createQueryBuilder('article');
    $count = $queryBuilder
        ->select('COUNT(article.id)')
        ->getQuery()
        ->getSingleScalarResult();
    

    接下来,我们要计算从 0 到 $count 的随机值。 但是函数rand 甚至mt_rand 都不够安全,因为:

    注意 此函数不会生成加密安全值,并且不应用于加密目的。如果您需要加密安全值,请考虑改用 random_int()、random_bytes() 或 openssl_random_pseudo_bytes()。

    我们应该使用例如函数random_int。 因此,为了选择安全的随机值,我们实现了以下代码:

    $offset = random_int(0, max(0, $count - 1));
    

    至少,我们可以检索表的随机行记录:

    return $this->createQueryBuilder('article')
        ->setFirstResult($offset)
        ->setMaxResult(1)
        ->getOneOrNullResult;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 2017-05-10
      • 1970-01-01
      • 2019-02-27
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多