我想知道如何使用SELECT FOUND_ROWS()
将LIMIT
包含到现有查询中,或者是否有更好的方法可以获得没有LIMIT
的总行数。
//SELECT * just for question
$q = $this->db->mysqli->prepare("SELECT SQL_CALC_FOUND_ROWS *
FROM countries_ship c
JOIN items i
ON c.item_id = i.id
JOIN item_expire e
ON c.item_id = e.item_id
JOIN users u
ON i.user_id = u.id
LEFT JOIN bids b
ON i.id = b.item_id
LEFT JOIN publishers p
ON i.item_publisher = p.id
LEFT JOIN tags_rel tr
ON c.item_id = tr.item_id
JOIN tags t
ON t.id = tr.tag_id
LEFT JOIN countries co
ON i.item_location = co.id
WHERE ".$where."
GROUP BY i.id ORDER BY ".$order." ".$limit."");
$count_rows = $this->db->mysqli->query("SELECT FOUND_ROWS()");
/* return of var_dump($count_rows);
object(mysqli_result)#74 (5) {
["current_field"]=>
int(0)
["field_count"]=>
int(1)
["lengths"]=>
NULL
["num_rows"]=>
int(1)
["type"]=>
int(0)
}
*/
$prep = join("", $prep);
call_user_func_array('mysqli_stmt_bind_param', array_merge ( array($q, $prep), $this->helperClass->valRef($ref) ) );
$q->execute();
$rows = $this->helperClass->bindResults($q);
$q->close();
return $rows;
不确定这是否100%有效,但这就是我解决问题的方法。
SELECT SQL_CALC_FOUND_ROWS
$resArray = array()
按照建议移动了第二个查询,并将结果添加到$resArray
。
$q->execute();
$rows = $this->helperClass->bindResults($q);
$q->close();
$count_rows = $this->db->mysqli->query("SELECT FOUND_ROWS()");
$count = mysqli_fetch_assoc($count_rows);
$resArray[] = $count;
$resArray[] = $rows;
return $resArray;
答案 0 :(得分:1)
虽然我可能错了,但似乎如果你只想获得符合条件的行数,你应该只使用SQL的计数聚合函数:
By changing number of arguments
By changing the data type
另一方面,如果你想以一种可以对它们进行分页的方式获取计数和所有细节,最好只运行两个查询 - 一个用于聚合计数,另一个用于有限的结果。
编辑:我已将i.id分组留在查询中,因为它会根据匹配的行的每个i.id给出一个计数。如果您只想完全使用TOTAL计数,则可以从select子句和group by中删除它,完全删除该组。
答案 1 :(得分:0)
您使用SQL_CALC_FOUND_ROWS
走在正确的轨道上,您只需要移动执行查询以计算结果的位置。因为它只在您运行原始查询后才有效。
因此,将$count_rows = $this->db->mysqli->query("SELECT FOUND_ROWS()");
移至$q->execute();