联合后的codeigniter分页

时间:2012-04-25 13:58:41

标签: mysql codeigniter pagination union

我有一个脚本,它使union包含数据库的不同表格 我需要使用分页显示结果,以使其对用户更具可读性。

这是我的代码:

//Fetch
foreach($query_info->result() as $info){

//I'm going to create a query for each row i get from the db
$query [] = (' (
    SELECT 
        '.$info->slug.'_dog.`name`, 
        `age`,
        '.$info->slug.'_breed.`name` as breed, 
        `sex`, 
        `link`,
        `sterilized`, 
        \''.$info->slug.'\' as prefix 
    FROM 
        '.$info->slug.'_dog, 
        '.$info->slug.'_breed 
    WHERE 
        '.$info->slug.'_dog.breed = '.$info->slug.'_breed.id 
        AND 
        '.$info->slug.'_dog.type = '.$type.'
)';
}

//implode different UNION
$query_final = implode(" UNION ",$query);

正如您所看到的,查询可能非常大。 我该如何分页?

我的第二个选择是使用表格的所有结果制作一个完整的视图,大约10-20个表... 哪个数据库更快? “大”UNION还是一个观点?

1 个答案:

答案 0 :(得分:2)

我不知道哪个更快,但是要做UNION,你可以为你的分页添加一个偏移和限制到总查询的结尾。只在第一个查询中,您可以在select中添加SQL_CALC_FOUND_ROWS。这样的事情:(注意SQL_CALC_FOUND_ROWS后没有逗号)

  

(SELECT SQL_CALC_FOUND_ROWS column1,column2 FROM etc ...)UNION(SELECT column1,column2 FROM etc ...)LIMIT 0,10

运行查询后,立即运行此查询:

  

SELECT FOUND_ROWS();

它会返回总记录,就像您的查询没有LIMIT一样。所以基本上你不必再次运行查询来计算结果。

要创建其余的分页,您可以使用CI自己的分页库: http://codeigniter.com/user_guide/libraries/pagination.html

//编辑: 要从模型中返回数据,您可以使用以下内容:

  

$ results ['data'] = $ this-> db-> query($ sql) - > result_array();

     

$ total = $ this-> db-> query('SELECT FOUND_ROWS()as total') - > row_array();

     

$ results ['total'] = $ total ['total'];

     

返回$ results;

它可能会进一步优化。