2010-02-10 15 views
0

我使用的是MySQL的INNER JOIN語句返回一個區分記錄各種結果在主表與聯接,類似於How to Join Multiple Joins yet return Distinct Values 我的查詢是PHP + MySQL的連接語句安排mysql_fetch陣列中的多個值排

SELECT cl.*, dep.dept_name 
FROM epapers.clientelle cl 
INNER JOIN epapers.dept_staff_users depu 
ON depu.user_id=cl.user_id 
INNER JOIN epapers.dept dep 
ON dep.dept_id=depu.dept_id 
group by cl.user_id 
ORDER BY cl.user_name ASC, 

我想在下面

echo "<tr bgcolor='#CCCCCC'> 
<td >$num</td><td >".$row[user_id]."</td><td>".$row[user_name]."</td> 
<td >".$row[fname]."</td><td >".$row[lname]."</td> 
<td >".$row[dept_name]."</td> 
<td >".$row[dept_name]."</td> 
<td >".$row[dept_name]."</td> 
<td >".$row[email]."</td>"; 
$TrID = "$row[user_id]"; 
echo "<td >"; 
echo '<form name="activate" action="activate_acc.php" method="POST" ;">'; 
echo "<input type='hidden' name='TrID' value='$TrID'>";  
echo "<input type='checkbox' name='active' value='$row[active]'>"; 
echo '<input type="submit" name="Submit" value="Delete">'; 
echo '</form>'; 
echo "</td >"; 
... 

注意部門可高達3個系顯示一個表來顯示上述內容。如何將mysql查詢結果以單行形式返回給部門?

回答

3

如果你正在使用MySQL,你可以使用GROUP_CONCAT但你必須做一些後期處理,這是一個有點難看。

SELECT cl.*, GROUP_CONCAT(DISTINCT dep.dept_name SEPARATOR '|') as dept_name 
FROM epapers.clientelle cl 
INNER JOIN epapers.dept_staff_users depu 
ON depu.user_id=cl.user_id 
INNER JOIN epapers.dept dep 
ON dep.dept_id=depu.dept_id 
group by cl.user_id 
ORDER BY cl.user_name ASC 



foreach(.... 
    $departments = explode('|', $row['dept_name']); 
... 
    if(isset($departments[0])) { 
     echo "<td>{$departments[0]}</td>"; 
    } else { 
     echo "<td></td>"; 
    } 
    // same check 
    echo "<td>{$departments[1]}</td>"; 
    // same check 
    echo "<td>{$departments[2]}</td>"; 

它有點在運行時denormalisation ...

+0

這個工作,但因爲我是用'而($行= mysql_fetch_array($結果))'我不得不使用此: '.... 回聲 「 $ NUM 」 $行[USER_ID] 「​​」 $行[USER_NAME]「 。。 「$行[FNAME]。」 「$行[L-NAME]。」「; $部門=爆炸( '|',$行[ 'DEPT_NAME']); 如果(isset($部門[0])){ 回聲 「​​{$部門[0]}」; }否則{ 回聲 「​​」; } ....' – 2010-02-10 17:41:54

0

那麼你可以用MySQL查詢方式做到這一點是加入該表爲三個部門,比如這個:選擇a.dept_id作爲dept_1 b.dept_id作爲dept_2等,併爲每個部門ID加入不同的表。這種方式雖然是處理器密集型的。按照寫入查詢的方式獲取數據的速度要快得多,然後在使用數據之前使用函數處理數據。這裏是我會怎麼做一個簡單的例子:

function prep_data($mysql_result) 
{  
    $results = array(); 
    $work = array(); 
    while ($row = mysql_fetch_assoc($mysql_result)) 
    { 
     if ($work['user_id'] == $row['user_id']) 
     { 
      // just add dept data to dept array 
      $dept[] = $row['dept_id']; 
     } 
     else 
     { 
      // data changed    
      if (isset($work['user_id'])) 
      { 
       // assign dept array to data array 
       $work['dept_id'] = $dept; 
       // add work array to results collection 
       array_push($results, $work);     
       // start working with the new user_id 
       $work = $row; 
       $dept = array($row['dept_id']); 
       continue;     
      } 
      else 
      { 
       // this is first pass. grab the row data and start the dept[] array; 
       $work = $row; 
       $dept = array($row['dept_id']); 
       continue; 
      } 
     } 
    } 
    $work['dept_id'] = $dept; 
    array_push($results, $work); 
    return($results); 
} 

//好運

+0

我決定用meouw的答案,因爲它使用現在用的是相同的查詢和更容易解釋給我的客戶。 – 2010-02-10 17:45:00