sql >> Database teknologi >  >> RDS >> Mysql

VÆLG og angiv børn og forældre

Prøv denne violin http://sqlfiddle.com/#!2/0a9c5/16 , sql-kode nedenfor

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;

udeladt php-isering af kode med vilje for at opretholde syntaksfremhævning, hvilket ikke ser ud til at virke alligevel

Hvis du overskrider den maksimalt tilladte group_concat-størrelse, kan du enten øge den eller bruge følgende version og gøre lidt mere bearbejdning i 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;

og i php, kun skeletkode angivet, skal du udfylde de faktiske værdier, forudsat at du bruger pdo og din pdostatement var hedder $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 ...
}

erstatte ting mellem ... med gyldig kode



  1. Python:MySQLdb og bibliotek er ikke indlæst:libmysqlclient.16.dylib

  2. Neo4j - Opret et forhold ved hjælp af Cypher

  3. Er COUNT hurtigere end at trække posterne og tælle i kode?

  4. Ikke flere data at læse fra socket-fejl