mysqli - 将SELECT FOUND_ROWS()与预准备语句一起使用

时间:2015-06-19 10:48:16

标签: php mysql mysqli

我想知道如何使用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%有效,但这就是我解决问题的方法。

  1. 更改了查询的开头SELECT SQL_CALC_FOUND_ROWS
  2. 创建新阵列 - $resArray = array()
  3. 按照建议移动了第二个查询,并将结果添加到$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;
    

2 个答案:

答案 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();

之后