java 数组group by_如何获取GROUP BY查询的总行数?

回答(11)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

请记住, PDOStatement 是 Traversable . 给出一个查询:

$query = $dbh->query('

SELECT

*

FROM

test

');

它可以迭代:

$it = new IteratorIterator($query);

echo '

', iterator_count($it), ' items

';

// Have to run the query again unfortunately

$query->execute();

foreach ($query as $row) {

echo '

', $row['title'], '

';

}

或者你可以这样做:

$it = new IteratorIterator($query);

$it->rewind();

if ($it->valid()) {

do {

$row = $it->current();

echo '

', $row['title'], '

';

$it->next();

} while ($it->valid());

} else {

echo '

No results

';

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如何将查询结果放在一个数组中,您可以在其中执行计数($ array)并使用查询结果后的行?例:

$sc='SELECT * FROM comments';

$res=array();

foreach($db->query($sc) as $row){

$res[]=$row;

}

echo "num rows: ".count($res);

echo "Select output:";

foreach($res as $row){ echo $row['comment'];}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

您必须使用rowCount - 返回受上一个SQL语句影响的行数

$query = $dbh->prepare("SELECT * FROM table_name");

$query->execute();

$count =$query->rowCount();

echo $count;

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我不使用PDO用于MySQL和PgSQL,但我是为SQLite做的 . 有没有办法(没有完全改变dbal后面)在PDO中计算这样的行?

对于this comment,SQLite问题是由3.x中的API更改引入的 .

也就是说,您可能希望在使用之前检查PDO如何实际实现该功能 .

我不熟悉它的内部结构,但我对PDO解析你的SQL的想法持怀疑态度(因为SQL语法错误会出现在DB的日志中),更不用说为了计算行数而尝试一点点意识使用最优策略 .

假设它确实没有,它在select语句中返回所有适用行的计数的现实策略包括从SQL语句中操作限制子句的字符串,以及以下任一项:

在其上运行select count()作为子查询(从而避免在PS中描述的问题);

打开游标,运行fetch all并计算行数;要么

在第一个位置打开了这样的光标,并且类似地计算剩余的行 .

然而,更好的计算方法是执行完全优化的查询 . 通常,这意味着重写您尝试分页的初始查询的有意义块 - 剥离不需要的字段并按操作排序等 .

最后,如果您的数据集足够大以计算任何类型的延迟,您可能还需要调查返回从statistics派生的估计值,和/或定期在Memcache中缓存结果 . 在某些时候,精确正确的计数不再有用......

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

它有点内存效率低但是如果你还在使用数据,我经常使用它:

$rows = $q->fetchAll();

$num_rows = count($rows);

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这是您的解决方案

$sql="SELECT count(*) FROM [tablename] WHERE key == ? ";

$sth = $this->db->prepare($sql);

$sth->execute(array($key));

$rows = $sth->fetch(PDO::FETCH_NUM);

echo $rows[0];

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果您愿意放弃一些抽象提示,那么您可以使用自定义包装器类,它只需将所有内容传递给PDO . 说,像这样:(警告,代码未经测试)

class SQLitePDOWrapper

{

private $pdo;

public function __construct( $dns, $uname = null, $pwd = null, $opts = null )

{

$this->pdo = new PDO( $dns, $unam, $pwd, $opts );

}

public function __call( $nm, $args )

{

$ret = call_user_func_array( array( $this->pdo, $nm ), $args );

if( $ret instanceof PDOStatement )

{

return new StatementWrapper( $this, $ret, $args[ 0 ] );

// I'm pretty sure args[ 0 ] will always be your query,

// even when binding

}

return $ret;

}

}

class StatementWrapper

{

private $pdo; private $stat; private $query;

public function __construct( PDO $pdo, PDOStatement $stat, $query )

{

$this->pdo = $pdo;

$this->stat = $stat;

this->query = $query;

}

public function rowCount()

{

if( strtolower( substr( $this->query, 0, 6 ) ) == 'select' )

{

// replace the select columns with a simple 'count(*)

$res = $this->pdo->query(

'SELECT COUNT(*)' .

substr( $this->query,

strpos( strtolower( $this->query ), 'from' ) )

)->fetch( PDO::FETCH_NUM );

return $res[ 0 ];

}

return $this->stat->rowCount();

}

public function __call( $nm, $args )

{

return call_user_func_array( array( $this->stat, $nm ), $args );

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这是另一个问题,错误地说,产生了很多可怕的解决方案,所有这些都使解决一个不存在的问题变得非常复杂 .

任何数据库交互的极其简单明了的规则是

始终选择您需要的唯一数据 .

从这个角度来看,问题是错误的,接受的答案是对的 . 但其他提议的解决方案非常糟糕 .

问题是“如何以错误的方式计算” . 一个人不应该直截了当地回答它,而是唯一正确的答案是“一个人永远不应该选择行来计算它们 . 相反,总是要求数据库为你计算行数 . ”这个规则是如此明显,以至于看到如此多的尝试打破它是不可能的 .

在学习了这条规则后,我们会发现这是一个 SQL question ,甚至与PDO无关 . 并且,从SQL的角度来看,它是否正确地被问到,答案会在瞬间出现 - DISTINCT .

$num = $db->query('SELECT count(distinct boele) FROM tbl WHERE oele = 2')->fetchColumn();

是这个特定问题的正确答案 .

从上述规则的角度来看,开幕式海报自己的解决方案也是可以接受的,但总的来说效率较低条款 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我最终使用的方法非常简单:

$query = 'SELECT a, b, c FROM tbl WHERE oele = 2 GROUP BY boele';

$nrows = $db->query("SELECT COUNT(1) FROM ($query) x")->fetchColumn();

可能不是最有效的,但它似乎是万无一失的,因为它实际上计算了原始查询的结果 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

有两种方法可以计算行数 .

$query = "SELECT count(*) as total from table1";

$prepare = $link->prepare($query);

$prepare->execute();

$row = $prepare->fetch(PDO::FETCH_ASSOC);

echo $row['total']; // This will return you a number of rows.

或者第二种方式

$query = "SELECT field1, field2 from table1";

$prepare = $link->prepare($query);

$prepare->execute();

$row = $prepare->fetch(PDO::FETCH_NUM);

echo $rows[0]; // This will return you a number of rows as well.

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

也许这会为你做到这一点?

$FoundRows = $DataObject->query('SELECT FOUND_ROWS() AS Count')->fetchColumn();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值