我基本上希望能够获取任何非嵌套的SQL字符串并将其转换为SQL以使用相同的正则表达式获取所有计数。
它必须能够匹配SELECT和FROM之间的任何东西并用count(*)替换,但我还没有分配经验值来升级我的正则表达式。
即。
SELECT col1, col2 FROM my_table where..." to "SELECT count(*) FROM my_table where...
或
SELECT * FROM my_table where..." to "SELECT count(*) FROM my_table where...
答案 0 :(得分:3)
为什么不做呢
SELECT COUNT(*) from ( <insert original sql here> ) as X
答案 1 :(得分:0)
在MySQL中,您可以使用SQL_CALC_FOUND_ROWS
,然后使用FOUND_ROWS()
进行任何查询。所以:
SELECT SQL_CALC_FOUND_ROWS . . .
FROM . . .
然后获取行数:
SELECT FOUND_ROWS()
这是在documentation。
中定义的答案 2 :(得分:0)
对于正则表达式,您可以使用一个简单的演示here。
基本上,我们用SELECT
替换FROM
和COUNT(*)
之间的任何内容。细节也在链接处。
请注意,这将有助于您的思考,但无法进行深入测试。请自行进行一些测试。
您还可以使用该链接在Python,JavaScript等中生成代码。
编辑1:链接被封装为代码段,因此无效。删除了代码元标记。
答案 3 :(得分:0)
我总是相信,当你没有更简单或任何选择时,应该使用regex
。在您的情况下,您可以使用简单的SQL逻辑而不是正则表达式来执行此操作。您可以按原样将原始查询传递给MySQL过程或其他任何操作并执行此操作:
set @inputQuery = 'SELECT col1, col2 FROM my_table where id = 1'; -- you will pass this
set @startIndex = locate('select', @inputQuery) + char_length(rtrim('select'));
set @endIndex = locate('where', @inputQuery);
set @subString = substring(@inputQuery, @startIndex, @endIndex - @startIndex);
set @finalQuery = replace(@inputQuery, @subString, ' count(*) ');
select @finalQuery;
输出:
SELECT count(*) where id = 1