इस पहेली को आजमाएं 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-ization छोड़ दिया, जो वैसे भी काम नहीं करता है
यदि आप अधिकतम अनुमत 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 var का नाम $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 ...
}
सामान को बीच में बदलें ... मान्य कोड के साथ