10

我正在尝试获取应用 LIMIT 时为特定查询找到的总行数。我在 PHP/MySQL 中成功找到了答案,但我无法在 Zend/Doctrine 中转换逻辑。我正在使用 Doctrine 2.3/Zend 1.12。

我不想使用两个不同的查询来查找结果:

PHP代码:

<?php
$con = mysql_connect('localhost', 'root', '');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("myproject", $con);

$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM `user` WHERE `user_country`='us' LIMIT 10";
$result = mysql_query($sql);
$sql = "SELECT FOUND_ROWS() AS `found_rows`;";
$rows = mysql_query($sql);
$rows = mysql_fetch_assoc($rows);
$total_rows = $rows['found_rows'];
echo $total_rows;
?>

我还在 MySQL Query 中尝试了以下操作:

尝试联合:

    SELECT COUNT( * ) FROM  `user` WHERE  `user_country` =  'US' 
UNION SELECT `user_id` FROM `user` WHERE `user_country` = 'US' LIMIT 10;

尝试选择:

    SELECT  *,(SELECT COUNT(*) from `user` where `user_country`='US') as Count 
from `user` where `user_country`='US' LIMIT 10;

上述两种尝试都需要 Count() 的时间:

有人可以帮我找到解决方案吗..

教义:

$qry = $this->manager()->createQueryBuilder()
                    ->from($this->entity, 'e')
                    ->select('e');
$qry->where('e.user_country = :country');
$qry->setParameter('country', 'us');
$limit='10';
$qry->setMaxResults($limit);

我怎样才能将上面的学说代码转换成上面的 PHP 结果查询之类的东西?可能吗?

4

3 回答 3

10

有一个分页功能,它内置在 2.2 中,并且与您正在寻找的功能类似:

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/pagination.html#pagination

但我不相信它使用SQL_CALC_FOUND_ROWS:它执行两个(或三个,取决于您如何配置它)单独的查询来获取结果,这通常是正确的方法。

如果你真的坚持使用 MySQL 特性,我认为你需要使用原始 SQL 和结果集映射。这是一个例子:

教义 2 中的行数


在一个完全独立的注释上,测试是否SQL_CALC_FOUND_ROWS真的值得用于您的特定查询。Count 在 MySQL 中针对您正在执行的查询进行了很好的优化。特别看这个问题:

哪个最快?SELECT SQL_CALC_FOUND_ROWS FROM `table`,或 SELECT COUNT(*)

于 2013-06-24T10:49:26.147 回答
2

You can get count by accessing to EntityPersister::count(array $criteria)

For example:

$count = $doctrineEntityManager
        ->getUnitOfWork()
        ->getEntityPersister(Entity::class)
        ->count($criteria);
于 2016-08-17T06:59:50.020 回答
-1

也许这可以帮助你

Doctrine::getTable('TableName')->createQuery('t')
->where('Your Condition') ->execute() ->rowCount();

或者

Doctrine::getTable('TableName')->createQuery('t')
->where('Your Condition') ->count();

我更喜欢第二个

你可以这样做,

$q = Doctrine_Query::create()
        ->select('ss.*')
        ->from('SalarySurvey ss')
        ->where('ss.user_id=?', $user_id)
        ->groupBy('created_at')
        ->execute();
$totalData = $q->count();

对于LIMIT

$q = Doctrine_Query::create()
        ->select('u.username, p.phonenumber')
        ->from('User u')
        ->leftJoin('u.Phonenumbers p')
        ->limit(20);

echo $q->getSqlQuery();

这个查询的输出是这样的——

SELECT
    u.id AS u__id,
    u.username AS u__username,
    p.id AS p__id,
    p.phonenumber AS p__phonenumber
FROM user u
    LEFT JOIN phonenumber p
        ON u.id = p.user_id
LIMIT 20

有关更多详细信息, 请查看此处的检查

于 2013-06-27T14:46:01.997 回答