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);

ご覧のとおり、クエリは非常に大きくなる可能性があります。どうすればページネーションできますか?

私の 2 番目のオプションは、約 10 ~ 20 のテーブルのすべての結果を含む完全なビューを作成することです...どちらがデータベースにとって高速ですか? 「大きな」ユニオンまたはビュー?

4

1 に答える 1

2

どちらが速いかはわかりませんが、UNIONを実行するには、ページネーションのクエリ全体の最後にオフセットと制限を追加できます。最初のクエリでのみ、選択にSQL_CALC_FOUND_ROWSを追加できます。このようなもの:(SQL_CALC_FOUND_ROWSの後にコンマがないことに注意してください)

(SELECT SQL_CALC_FOUND_ROWS column1、column2 FROMなど...)UNION(SELECT column1、column2 FROMなど...)LIMIT 0,10

クエリを実行したら、すぐに次のクエリを実行します。

SELECT 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'];

$resultsを返します。

おそらくもう少し最適化することができます。

于 2012-04-25T17:16:59.637 に答える