我有一个特定的对象处理通用HTML表的某些查询。这些查询只是具有子查询,聚合等的普通SELECT。
在当前情况下,应用程序会计算查询将提供的结果数,以启用(自动)分页:
1. SELECT COUNT(*) FROM (SELECT this, that, SUM(foo), COUNT(bar) FROM b WHERE x = y)
然后一些对象进程并添加分页等。表中填充了相同的查询+ LIMIT子句:
2. SELECT this, that, SUM(foo), COUNT(bar) FROM b WHERE x = y LIMIT n
但是那个计数查询(如图1所示)非常慢,所以我想用这个替换它:
3. SELECT COUNT(*) FROM b WHERE x = y
< - 来自1&的查询2,但我将this, that, SUM(foo), COUNT(bar)
替换为COUNT(*)
。
问题是:当我使用子查询时,如何有效地替换SELECT和FROM之间的所有内容而不会搞砸?我可以用正则表达式做到这一点吗?还有另一种方式吗?
每次查询都不同。它是一个执行2个查询的通用处理程序:1个计数查询,1个用于表中的数据。我正在尝试找到一个通用的解决方案来切割第一个SELECT
及其对应的FROM
之间的所有内容。
答案 0 :(得分:1)
我尝试过以下操作。我希望它有所帮助。
<?php
$new = "source,destination";
$source = "SELECT t.id , t.name, t.number from tbl_tttt t";
$start = 'select ';
$end = ' from';
$data = preg_replace('#('.preg_quote($start).')(.*)('.preg_quote($end).')#si', '$1'.$new.'$3', $source);
echo $data;
?>
然后查询变为:
SELECT source,destination from tbl_tttt t