2014-02-25 63 views
0

我有一些数据以这种格式排列。与家族层次结构/布局相关的MySQL查询

SR | NAME   | FATHER NAME  | ADDRESS | GROUP 
1 | SAM FISHER  | MR. KINGSLEY  | PARK VIEW | USER 
2 | JOHN FISHER  | MR. KINGSLEY  | PARK VIEW | USER 
3 | KADINAL   | MR. BEN   | PARK VIEW | USER 

这里1 & 2金斯利先生的孩子有相同的地址和组。 但第三个不是金斯利先生的孩子,但有同样的地址和组。

我需要这样的查询,使我能得到这样的数据报告同级。

输出应该是这样的

兄弟报告

SR | NAME   | FATHER NAME  | ADDRESS | GROUP 
1 | SAM FISHER  | MR. KINGSLEY  | PARK VIEW | USER 
    JOHN FISHER 
------------------------------------------------------------- 
2 | KADINAL   | MR. BEN   | PARK VIEW | USER 

现在我使用MySQL查询

SELECT id, fat_name, sec, address, class, mobile, 
    GROUP_CONCAT(DISTINCT stu_name order by class ASC SEPARATOR ', ') stu_name, 
    GROUP_CONCAT(DISTINCT class order by class ASC SEPARATOR '<br>') class, 
    GROUP_CONCAT(DISTINCT sec order by class ASC SEPARATOR '<br>') sec, 
    GROUP_CONCAT(DISTINCT address order by class ASC SEPARATOR '<br>') address, 
    GROUP_CONCAT(DISTINCT adm_no order by class ASC SEPARATOR '<br>') adm_no 
FROM student 
where class <> 'OUT' and session='".$session."' 
GROUP BY fat_name 
order by class DESC 

PHP:

<?php 
echo "<table id='testTable'><tr>"; 
$count = 1; 

while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) 
    { 
    extract($row); 
    $stu_name = $row['stu_name']; 
    $fat_name = $row['fat_name']; 
    $address = $row['address']; 
    echo "<td style='width:33%;'><br/>" . $stu_name . "<br/>" . $fat_name . "<br/>" . $address . "<br/><br‌​/></td>"; 
    if ($count++ % 3 == 0) 
     { 
     echo "</tr><tr>"; 
     } 
    } 

echo "</tr></table><br/><br/><br/>"; 

它也有一个条件,如果约翰费舍尔与山姆费舍尔一起被包括在顶端,那么约翰将不会在底部重复。

+0

不知道你可以查询做到这一点,但它使用PHP函数是可能的。 –

+0

有什么想法@ICanHasCheezburger – alleged

+0

你可以粘贴你如何打印上述报告的代码? –

回答

0

尝试(未经测试):

如果
echo "<table id='testTable'><tr>"; 
$count = 1; 
$keep_track = array(); //array to keep track of father names already displayed 
while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) 
{ 
    extract($row); 
    $stu_name = $row['stu_name']; 
    $fat_name = $row['fat_name']; 
    $address = $row['address']; 

    //over here we check if the father name has been displayed already, 
    //initially it will be false 
    if(array_key_exists($fat_name,$keep_track)){ 
     //if it has been mentioned, skip all fields and display only 'stu_name' 
     echo "<td style='width:33%;'><br/>" . $stu_name . "<br/><br/><br/><br‌​/></td>"; 
    } 
    else 
    { 
     //if it hasn't been displayed, show all fields 
     echo "<td style='width:33%;'><br/>" . $stu_name . "<br/>" . $fat_name . "<br/>" . $address . "<br/><br‌​/></td>"; 
     //record father name in array so that in next loop 
     //it is not displayed again 
     $keep_track[] = $fat_name; 
    } 
    if ($count++ % 3 == 0) 
    { 
     echo "</tr><tr>"; 
    } 

} 

echo "</tr></table><br/><br/><br/>"; 
1

如果“FATHER NAME”值相同的记录也具有相同的ADDRESS和GROUP值,则应考虑重新设计您的表并将“父亲名称”,ADDRESS和GROUP放在单独的表中,并将“Name”另一张国外参考表。否则,对于你想要达到的目标是没有意义的。