【问题标题】:Replace everything between SELECT and FROM替换 SELECT 和 FROM 之间的所有内容
【发布时间】:2013-04-26 12:26:30
【问题描述】:

我有某个对象处理通用 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 this, that, SUM(foo), COUNT(bar) 替换为 COUNT(*)

问题是:当我使用子查询时,如何有效地替换 SELECT 和 FROM 之间的所有内容而不会搞砸?我可以用正则表达式做到这一点吗?还有其他方法吗?

查询每次都不同。它是一个执行 2 个查询的通用处理程序:1 个计数查询,1 个用于表中的数据。我正在尝试找到一个通用的解决方案来削减第一个 SELECT 与其对应的 FROM 之间的所有内容。

【问题讨论】:

  • 您的子查询是否总是只包含您从中查询的一个表?
  • 不,大多数查询使用 JOIN

标签: mysql sql regex


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多