1

クエリで FOUND_ROWS() を使用しようとしていますが、関数が間違った値を返すことがあります。

SELECT SQL_CALC_FOUND_ROWS adminslog.*, admins.fullName FROM adminslog 
JOIN admins ON admins.id=adminslog.userId ORDER BY date DESC LIMIT 0,12

このクエリでは、正しい値が得られるものもあれば、制限の値が間違っているものもあります。

LIMIT 0,12        164rows        right
LIMIT 12,12       164rows        right
LIMIT 36,12       164rows        right
LIMIT 48,12       164rows        right
LIMIT 50,12       60rows         wrong
LIMIT 62,12       60rows         wrong

これが私のクラス構成です:

class list_table
{
public $number,$page_number,$all_rec,$table_rows,$query_str,$query,$fetch,$table,$db,$fields,$i=0,$page_n,$onclick;

function __construct($query_str,$fields,$page_n,$onclick,$page_number,$number,$db)
{
    $this->fields = $fields; $this->page_number = (((int)$page_number<1)?1:(int)$page_number); $this->number = (int)$number; $this->db = $db;
    $this->i = $this->page_number*$this->number-$this->number; $this->page_n = $page_n; $this->onclick = $onclick;
    $this->query_str = substr(trim($query_str),0,7)."SQL_CALC_FOUND_ROWS ".substr(trim($query_str),7)." LIMIT ".(($this->page_number*$this->number)-$this->number).",".$this->number;

    $this->query = $this->db->query($this->query_str);
    $this->table_rows = $this->db->query("SELECT FOUND_ROWS()")->fetchColumn();

    $this->all_rec = $this->query->rowCount();
    $this->fetch = $this->query->fetch();

    //$this->table_rows = $this->table_rows->fetch();
    //$this->table_rows = $this->table_rows['cnt'];
    print $this->table_rows;
}

other functions...
}
4

2 に答える 2

2

使用しているバージョンによっては、mysql のバグがこの問題の原因である可能性があります: http://bugs.mysql.com/bug.php?id=1468

クエリで GROUP BY 句を使用することで回避できます。

于 2013-05-11T11:35:32.710 に答える
1

FOUND_ROWS()質問:すべてのクエリで毎回最初のクエリが正しいと思いますか?

そうであれば、最初のクエリでのみこのコードを実行し、セッションに保存できることを確認してください。

if($this->page_number==1) $_SESSION['cr'] = $this->table_rows = $this->db->query("SELECT FOUND_ROWS()")->fetchColumn();

このようにして、毎回行数をチェックする必要はありません。

于 2013-05-11T09:42:32.897 に答える