リストsql最適化(サブクエリ、テーブル接続)

2389 ワード

リストページで表の左右の接続を使うかもしれませんが、sql文を書くときは「2つ以上の表のすべての表データを接続し、10個検出する」ことを避けます.あるいは、「1枚のテーブルを読み込んで10個のデータを取り、forまたはforeachのループクエリを行い、この10個をクエリする」のではなく、サブクエリを行い、この10個を検出して別のテーブルを管理します.
tpの書き方
/*         10 */
$subQuery = M('usb')
    ->where($map)
    ->limit($page->firstRow , $page->listRows)
    ->field('id,name')
    ->buildSql();
/*         */
$list = $user
    ->table($subQuery.'B')
    ->join('LEFT JOIN `user` AS A ON A.id = B.id')
    ->field('A.`id` AS user_id,A.`name` AS user_name,B.`id`,B.`name`')
    ->select();

sql文
SELECT
    t.`user_name`,r.`name` as region_name
FROM (
    SELECT
        `id`,
        `name` as user_name ,
        `region_id`
    FROM  
        user
    WHERE 
        LIMIT 0,10

) as t 

LEFT JOIN region as r 

on r.id = t.region_id;

もしあなたがもっと良い論理的な考えがあれば、私にメッセージを残してください.