【发布时间】:2010-11-20 05:00:34
【问题描述】:
亲爱的...我熟悉 MySQL 但不熟悉 Firebird。
我想将我的 php 页面从 MySQL 更改为 Firebird 查询。但是在更改命令 FOUND_ROWS() 时遇到了一些困难。有谁知道 Firebird 中 FOUND_ROWS() 的相同功能是什么?
我浏览了每个网站,但没有答案。我被困在这种情况下。请帮助。
【问题讨论】:
亲爱的...我熟悉 MySQL 但不熟悉 Firebird。
我想将我的 php 页面从 MySQL 更改为 Firebird 查询。但是在更改命令 FOUND_ROWS() 时遇到了一些困难。有谁知道 Firebird 中 FOUND_ROWS() 的相同功能是什么?
我浏览了每个网站,但没有答案。我被困在这种情况下。请帮助。
【问题讨论】:
类似于@Andrei K. 的回答。
回答您的问题:Firebird 中对于 FOUND_ROWS() MySQL 函数/语句没有等效项。
解决方法:如果您非常想知道该行数,请让引擎运行一个新查询来计算第一个查询的特殊版本存在的行数。对于简单的查询,@Andrei K. answer 是准确的,但对于一般情况,包括使用 group by 和有子句的查询使用这样的查询:
select count(*)
from (your original query here) q1;
如果原始查询中存在 first/skip 和 order by 子句,您必须排除它。因此,对于这样的查询:
select first 10 skip 20 pd.productcode, extract(year from ph.purchasedate) year, sum(pd.quantity) year_quantity
from purchase_details pd
inner join purchase_header ph
on ph.id = pd.purchase_id
where ph.cancelled = 0
and ph.salesman = 10
group by pd.productcode, extract(year from ph.purchasedate)
having sum(pd.quantity) > 1000
order by sum(pd.quantity) desc;
found_rows 等效查询将是:
select count(*)
from (
select pd.productcode, extract(year from ph.purchasedate) year, sum(pd.quantity) year_quantity
from purchase_details pd
inner join purchase_header ph
on ph.id = pd.purchase_id
where ph.cancelled = 0
and ph.salesman = 10
group by pd.productcode, extract(year from ph.purchasedate)
having sum(pd.quantity) > 1000
) q1
根据我的经验,这适用于 99.9% 的查询。
警告这种方法效率很低,使用风险自负。
【讨论】:
如果不运行查询并获取所有数据或运行查询,Firebird 无法知道有多少行会返回查询:
SELECT COUNT(*) FROM <your tables and conditions go here>
【讨论】:
如果您使用此 FOUND_ROWS() 来显示类似显示 X 行中的 Y 行,请查看您的新版本页面是否可以在没有该信息的情况下使用。使用 Firebird 的方式,阅读文档似乎是,首先运行不带 LIMIT 的查询,然后运行 LIMIT。 LIMIT 是 MySQL,不确定在 Firebird 中叫什么。然后是 SQL_CALC_ROWS 你应该从 MySQL 翻译成 Firebird。
【讨论】: