由于性能问题,我尽量避免使用Count().(即SELECT COUNT()FROM Users)
如果我在phpMyAdmin中运行以下命令,则可以:
SELECT SQL_CALC_FOUND_ROWS * FROM Users;
SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)
它将返回行数#.即用户数量.
但是,如果我在PHP中运行,我不能这样做:
$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users;
SELECT FOUND_ROWS(); ';
mysql_query($query);
Run Code Online (Sandbox Code Playgroud)
似乎PHP不喜欢传入两个查询.那么,我该怎么做呢?
所以我有一个有500多万行的表.当我使用SQL_CALC_FOUND_ROWS时,查询将永远挂起.当我拿出它时,查询会在一秒内执行LIMIT,25.我的问题是分页原因是否有替代获得总行数?
我们有一个laravel 4.1应用程序,曾经在PHP 5.4下运行,但是自从升级到5.6.13(今天到5.6.14)后,我注意到查询已经开始有时返回0 FOUND_ROWS().在我们的一些查询中,它似乎是间歇性的,但在其他问题上,它更像是一个永久性的问题.
受影响最大的集合是具有子查询的集合.
我们正在使用PDO(我们没有使用laravel模型,只是直接与其PDO对象进行交互).MySQL在这个时间框架内也没有被修改过.
尝试了所有种类 - 一个建议是将跟踪模式设置为0,但这并没有帮助.我尝试设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY为false,但是当您尝试选择时会导致PDO错误FOUND_ROWS()(现在无法获得确切的消息).
没有回到5.4(请上帝没有),我完全卡住了......
直接在MySQL中运行这些查询,然后运行FOUND_ROWS() 始终返回正确的结果.
我目前正在探讨如何使用预准备语句实现SQL_CALC_FOUND_ROWS.
我正在写一个分页类,显然我想在查询中添加LIMIT,但也要查找总行数.
这是该课程的一个例子.
$query="select SQL_CALC_FOUND_ROWS id,title,location,salary,employer from jobs where region=38 limit 0,3";
if($stmt = $connection->prepare($query)) {
$stmt->execute()or die($connection->error); //execute query
$stmt->bind_result($id,$title,$location,$salary,$employer,$image);
while($stmt->fetch()){
$jobs[$x]['id']=$id;
$jobs[$x]['title']=$title;
$jobs[$x]['location']=$location;
$jobs[$x]['salary']=$salary;
$jobs[$x]['employer']=$employer;
$jobs[$x]['image']=$image;
$x++;
}
$stmt->close();//close statement
}
Run Code Online (Sandbox Code Playgroud)
关于如何获取SQL_CALC_FOUND_ROWS实际值,我有点难过?我曾想过添加以下内容:
$stmt->store_result();
$count=$stmt->num_rows;
Run Code Online (Sandbox Code Playgroud)
但是这只给出了一个基于LIMIT的数字,所以在上面的例子中它应该是3而不是完整的6.
希望有道理.
当你SELECT在幕后处理一个通过phpmyadmin时,它有时会添加一个LIMIT 0,30,和/或它会抛出一个SQL_CALC_FOUND_ROWS,SELECT所以它可以告诉我有多少结果没有LIMIT.
不幸的是,添加SQL_CALC_FOUND_ROWS有时需要的处理比我预期的要多得多(例如,比我运行原始的无问题查询更多).
是否有全局配置选项来禁用phpmyadmin对我的查询的修改?
我可以在每个查询的基础上使用哪些技巧来阻止phpmyadmin的修改?
我在本地系统上运行以下查询
SELECT FOUND_ROWS() FROM table_name LIMIT 1;
SQL Version : 5.6.16
Run Code Online (Sandbox Code Playgroud)
它返回行数.
当相同的查询在服务器上运行时(SQL版本:5.7.17),它返回0.
在互联网上搜索后,人们建议使用
SQL_CALC_FOUND_ROWS
所以我也在本地和服务器上使用以下查询.
SELECT SQL_CALC_FOUND_ROWS * FROM users
SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)
但结果是相同的,它在本地(SQL版本:5.8.16)上工作正常,并在服务器上返回0(SQL版本:5.7.17).
我总共有6行。当我做一个查询(比如 SELECT * from table)时,我有
知道这种奇怪行为的原因是什么吗?
SQL查询
SELECT `places`.*, `category`.*, COUNT(places_reviews.place_id) AS num_reviews, (places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popularity.rating_3 + 4*places_popularity.rating_4 + 5*places_popularity.rating_5)/(places_popularity.rating_1 + places_popularity.rating_2 + places_popularity.rating_3 + places_popularity.rating_4 + places_popularity.rating_5) AS …Run Code Online (Sandbox Code Playgroud)