我有一个脚本,它使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还是一个观点?
答案 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;
它可能会进一步优化。