【问题标题】:PHP+MySQL join statement arrange multiple values as row in mysql_fetch arrayPHP + MySQL join语句将多个值排列为mysql fetch数组中的行
【发布时间】:2010-02-11 02:29:21
【问题描述】:

我正在使用 MySQL INNER JOIN 语句,该语句从连接返回主表中一条不同记录的各种结果,类似于 How to Join Multiple Joins yet return Distinct Values 我的查询是

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查询结果?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    如果您使用 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>";
    

    在运行时有点非规范化......

    【讨论】:

    • 这行得通,但由于我使用的是while($row=mysql_fetch_array($result)),所以我不得不使用这个:.... echo "&lt;tr bgcolor='#CCCCCC'&gt;&lt;td &gt;$num&lt;/td&gt; &lt;td &gt;".$row[user_id]."&lt;/td&gt;&lt;td&gt;".$row[user_name]."&lt;/td&gt; &lt;td &gt;".$row[fname]."&lt;/td&gt;&lt;td &gt;".$row[lname]."&lt;/td&gt;"; $departments = explode( '|', $row['dept_name'] ); if( isset( $departments[0] ) ) { echo "&lt;td&gt;{$departments[0]}&lt;/td&gt;"; } else { echo "&lt;td&gt;&lt;/td&gt;"; } ....
    【解决方案2】:

    您可以使用 mysql 查询的方法是连接三个部门中的每一个的表,例如:选择 a.dept_id 作为 dept_1 b.dept_id 作为 dept_2 等,并以不同的 for 连接同一个表每个部门编号。这种方式虽然是处理器密集型的。以您编写查询的方式获取数据,然后在使用之前使用函数处理数据会快得多。这是我将如何做到的一个简单示例:

    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);
    }
    

    //祝你好运

    【讨论】:

    • 我决定使用 meouw 的答案,因为它使用的是相同的查询,并且更容易向我的客户解释。
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2019-09-24
    相关资源
    最近更新 更多