按列值将数组中的mysql行分组

时间:2016-06-09 23:00:00

标签: php mysql

我有一个这种格式的mysql表

Mysql table format
_______________________________
| column1 | column2 | column3 |
|_________|_________|_________|
|   A     |  val Z  |  val Y  |
|_________|_________|_________|
|   A     |  val X  |  val W  |
|_________|_________|_________|
|   A     |  val V  |  val U  |
|_________|_________|_________|
|   B     |  val T  |  val S  |
|_________|_________|_________|
|   B     |  val R  |  val Q  |
|_________|_________|_________|
|   C     |  val P  |  val O  |
|_________|_________|_________|

我需要做的是返回数组中column1中每个值出现的所有行。数组可能是这样的:

$A = array($row1,$row2,$row3);

$row1 = array("column1"=>"A", "column2"=>"val Z", "column3"=>"val Y",);

$row2 = array("column1"=>"A", "column2"=>"val X", "column3"=>"val W",);

$row3 = array("column1"=>"A", "column2"=>"val V", "column3"=>"val V",);

我希望我足够清楚。基本上我需要按照column1中值的唯一性对行进行分组。

mysql结果应该包含如上所述分组的数组中的所有行。像这样的东西:

$result = array($A, $B, $C);

我需要对输出做的是将它显示在表格中。如果有更好的方法,请告诉我。我希望表格采用这种格式:

_________________________________________________
|  Header1  |  Header2  |  Header3  |  Header4  |
|___________|___________|___________|___________|
|    A      |   val Y   |   val W   |   val U   |
|___________|___________|___________|___________|
|    B      |   val S   |   val Q   |           |
|___________|___________|___________|___________|
|    C      |   val O   |           |           |
|___________|___________|___________|___________|

这是我唯一能想到的方法。如果有更好的方法,请告诉我。谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

假设您要在表格中显示 column3 数据,解决方案将如下:

更改您的查询
SELECT * FROM table;

SELECT column1, GROUP_CONCAT(column3 SEPARATOR ',') as column3 
FROM table 
GROUP BY column1 
ORDER BY COUNT(column1) DESC

执行查询并按照以下步骤进行操作

  1. 从结果集构造关联数组。
  2. 从关联数组中提取键。
  3. 计算表格中的列数,最后计算
  4. 构建表格
  5. 以下是代码:

    $sql = "SELECT column1, GROUP_CONCAT(column3 SEPARATOR ',') as column3 FROM table_name GROUP BY column1 ORDER BY COUNT(column1) DESC";
    $result_set = mysqli_query($conn, $sql);
    
    // construct an associative array
    $result_array = array();
    while($row = mysqli_fetch_assoc($result_set)){
        $result_array[$row['column1']] = explode(",", $row['column3']);
    }
    
    // extract the keys from the associative array
    $result = array_keys($result_array);
    
    // count the number of columns in the table
    $len = count($result_array[$result[0]]);
    
    // construct the table
    echo '<table border="1">';
    
    // display table headings 
    echo '<tr>';
    for($i = 1; $i <= $len + 1; ++$i){
        echo '<th>Header' . $i . '</th>';
    }
    echo '</tr>';
    
    // display table contents
    foreach($result as $k){
        echo '<tr>';
        echo '<td>' . $k . '</td>';
        for($i = 0; $i < $len; ++$i){
            echo '<td>';
            echo isset($result_array[$k][$i]) ? $result_array[$k][$i] : '';
            echo '</td>';
        }
        echo '</tr>';
    }
    
    echo '</table>';
    

    <强>输出:

    enter image description here

    注意:如果您想查看$result_array数组的结构,请执行var_dump($result_array);

答案 1 :(得分:0)

我不会写所有代码,但会给你一个解决方案草图:

1)feth all为您提供包含行的数组。称之为$rows

2)做foreach ($rows as $row)。内 使用column 1中的值创建临时数组。如果临时数组中不存在给定$row中第1列的值,请将其添加到临时数组广告执行output[] = row。否则,如果临时数组在第n个位置包含column 1的值,请执行$output[n][] = $row

此循环后输出应具有所需的形式。更直观的是将column 1的值保留为$output中的键并将其从行中删除。