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

子と親を選択して一覧表示します

    このフィドルを試してみてください http://sqlfiddle.com/#!2/0a9c5/16 > 、以下のSQLコード

    SELECT c.rule_id, c.rule_title, GROUP_CONCAT(r.rule_title)
    FROM RULES_TABLE AS c
    LEFT JOIN RULES_TABLE AS r
        ON r.parent_id = c.rule_id
    WHERE c.parent_id IS NULL AND c.public = 1
    GROUP BY c.rule_id
    ORDER BY c.cat_position, c.rule_position;
    

    構文の強調表示を維持するために意図的にコードのphp化を省略しましたが、とにかく機能しないようです

    許可されている最大group_concatサイズを超える場合は、サイズを増やすか、次のバージョンを使用して、phpでもう少し処理を行うことができます。

    SELECT c.rule_id, c.rule_title, r.rule_title as r_rule_title
    FROM RULES_TABLE AS c
    LEFT JOIN RULES_TABLE AS r
        ON r.parent_id = c.rule_id
    WHERE c.parent_id IS NULL AND c.public = 1
    ORDER BY c.cat_position, c.rule_position;
    

    PHPでは、スケルトンコードのみが提供され、pdoを使用し、pdostatement変数の名前が$queryであると仮定して、実際の値を入力します。 :

    $old_rule_id = null;
    $rrt = array(); // will contain all r.rule_titles for a give c.rule_id
    while( ($i = $query->fetch(PDO::FETCH_OBJ)) !== false ) {
        if( $old_rule_id != $i->rule_id ) {
            if( count($rrt) ) {
                echo ... all the data for previous rule from $rrt ...
                echo ... end of previous element ...
                $rrt = array(); // empty it to collect new data
            }
            echo ... start of current element use data from $i->rule_id and $i->rule_title ...
            $old_rule_id = $rule_id;
        }
        $rrt[] = $i->r_rule_title;
    }
    // the following is the same if from inside the while, minus reinitialization of $rrt;
    if( count($rrt) ) {
        echo ... all the data for previous rule from $rrt ...
        echo ... end of previous element ...
    }
    

    ...の間のものを有効なコードに置き換えます



    1. CodeIgniterリスト-フィールド

    2. MySQLのINDEX、PRIMARY、UNIQUE、FULLTEXTの違いは?

    3. MySQLで2つのテーブルを結合する方法

    4. 2つの異なるEC2インスタンスでのDjangoとPostgreSQLのセットアップ