1

我有一个脚本,可以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 个表......哪个数据库更快?“大”联合还是视图?

4

1 回答 1

2

我不知道哪个更快,但要执行 UNION,您可以在分页的总查询末尾添加偏移量和限制。仅在第一个查询中,您可以在选择中添加 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

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

选择 FOUND_ROWS();

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

要创建其余的分页,您可以使用 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'];

返回$结果;

它可能可以再优化一点。

于 2012-04-25T17:16:59.637 回答