【问题标题】:Group mysql rows in an array by column value按列值对数组中的 mysql 行进行分组
【发布时间】:2016-10-10 18:56:25
【问题描述】:

我有一个这种格式的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   |           |           |
|___________|___________|___________|___________|

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

【问题讨论】:

  • 将你的mysql查询添加到问题中
  • 我有这个 $sql = "SELECT * FROM table;"; $result = mysqli_query($conn, $sql); $rows = mysqli_fetch_assoc($result); foreach($rows as $row){ //print_r($row); } 在 foreach 循环中我应该做什么?

标签: php mysql


【解决方案1】:

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

1) feth all 为您提供带有行的数组。叫它$rows。

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

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

【讨论】:

  • 我不知道。 2. 这是我目前所拥有的
    $sql = "SELECT * FROM table;"; $result = mysqli_query($conn, $sql); $rows = mysqli_fetch_assoc($result); foreach($rows as $row){ //print_r($row); }
    @Tom
【解决方案2】:

假设您希望仅显示表格中的 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. 构造表

代码如下:

$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>';

输出:


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

【讨论】:

    猜你喜欢
    • 2017-07-05
    • 2012-09-24
    • 2013-02-19
    • 2017-08-17
    • 2020-07-23
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多