sql >> データベース >  >> RDS >> Mysql

非効率的なSQLクエリ

    このクエリを実行できます:

    SELECT c.id AS cid, c.slug AS cslug, c.name AS cname,
        s.id AS sid, s.name AS sname
    FROM categories AS c
        LEFT JOIN snippets AS s ON s.category = c.id
    WHERE c.live=1
    ORDER BY c.name, s.name
    

    次に、結果を繰り返し処理して、次のような適切な見出しを作成します。

    // last category ID
    $lastcid = 0;
    while ($r = $navQuery->fetch_object ()) {
    
        if ($r->cid != $lastcid) {
            // new category
    
            // let's close the last open category (if any)
            if ($lastcid)
                printf ('</li></ul>');
    
            // save current category
            $lastcid = $r->cid;
    
            // display category
            printf ('<li><a href="/%s">%s</a>', $r->cslug, $r->cname);
    
            // display first snippet
            printf ('<li><a href="/%s/%s">%s</a></li>', $r->cslug, $r->sname, $r->sname);
    
        } else {
    
            // category already processed, just display snippet
    
            // display snippet
            printf ('<li><a href="/%s/%s">%s</a></a>', $r->cslug, $r->sname, $r->sname);
        }
    }
    
    // let's close the last open category (if any)
    if ($lastcid)
        printf ('</li></ul>');
    

    printfを使用したことに注意してください ただし、代わりに、printfをラップするが、htmlspecialcharsを実行する独自の関数を使用する必要があります。 パラメータを介して(もちろん最初のものを除く)。

    免責事項:私は必ずしもそのような<ul>の使用を推奨するわけではありません s。

    このコードは、1つのクエリで取得した階層データを処理する基本的な考え方を示すためのものです。



    1. MySQL / PHPでリアルタイムデータベースポーリングを行うにはどうすればよいですか?

    2. mysql日時の比較

    3. アンドロイドルームデータベースとの1対多の関係でフィルタリングする方法

    4. PostgreSQL列は存在しませんが、実際には存在します