将结果列在组中

时间:2011-07-07 21:53:18

标签: php mysql

我无法在php中“排序”我的mysql结果。

这是我拥有的数据库

id¦ value  ¦ category
---------------------------
1 ¦ Value1 ¦ category1
2 ¦ Value2 ¦ category2
3 ¦ Value3 ¦ category2
4 ¦ Value4 ¦ category3
5 ¦ Value5 ¦ category1
6 ¦ Value6 ¦ category1


我正在尝试做的是在php中得到如下结果:

类别1

  • 值1
  • 值5
  • Value6

类别2

  • 值2
  • 值3

类别3

  • 值4


任何帮助都很有用。感谢

6 个答案:

答案 0 :(得分:1)

SQL:

$SQL = 'SELECT * FROM theTable SORT BY category ASC';

PHP:

$results = mysql_fetch....($SQL);
$record_table = array();

// Create the array for the list
foreach($results as $row)
{
   $record_table[$row['category']][] = $row['value'];
}

// Output the HTML list
foreach($record_table as $key => $val)
{
    echo '<ul id="' . $key . '">';

    foreach($val as $v)
    {
        echo '<li>' . $v . '</li>';
    }

    echo '</ul>';
}

答案 1 :(得分:1)

SELECT id, value, category FROM table;

然后在PHP中

while($row = mysql_fetch_assoc($result)) {
    $myArray[$row['category']][] = $row['value'];
}

答案 2 :(得分:0)

循环遍历结果集,在初始数组中为您遇到的每个新类别创建数组键,并将值数据推入其中。

如果存在类别键,则跳过键创建阶段,只需添加数据。

然后,您可以遍历生成的数组并输出每个类别(键)的所有数据(值数组)。

答案 3 :(得分:0)

使用GROUP_CONCAT,您将获得输出将以,

分隔的字符串
      SELECT GROUP_CONCAT(value) AS valueList FROM tableName GROUP BY category

您还可以使用某种格式的GROUP_CONCAT()。像

SELECT GROUP_CONCAT( value SEPARATOR ‘-’ )

以上查询将使用-代替,

更改订单和卖空

SELECT GROUP_CONCAT( value ORDER BY Category DESC )

然后按脚本语言重新安排,如果使用php,则尝试使用explode()

注意: GROUP_CONCAT()会忽略NULL值。

答案 4 :(得分:0)

感谢大家的帮助。我将使用AlienWebguy和jchavannes代码的混合,这是完美的,正是我正在寻找的。

代码如下所示:

<强> SQL:

$SQL = "SELECT * FROM table_name";
$results = mysql_query($SQL);

<强> PHP:

while($row = mysql_fetch_assoc($results)) {
    $myArray[$row['category']][] = $row['value'];   
}

foreach($myArray as $key => $val)
{
    echo $key;
    echo '<ul>';

    foreach($val as $v)
    {
        echo '<li>' . $v . '</li>';
    }

    echo '</ul>';
}

答案 5 :(得分:0)

这是一个只用一个循环完成的解决方案。

$currentCategory = null;
$closeTag = "";

//Using MySQLi since mysql_* functions are obsoletes
$mysqli = new mysqli($host, $username, $password, $dbname);

/**
 * Here I use an ORDER BY to group the result by categories
 */
$selectStmt = $mysqli->prepare("SELECT id, value, category FROM table_name ORDER BY category ASC");
$selectStmt->execute();        
$selectStmt->bind_result($id, $value, $category);
while($selectStmt->fetch()) {
    if ($currentCategory != $category) {
        /**
         * In the first iteration this variable will be empty, so the <ul> tag 
         * will not be closed
         */
        echo $closeTag; //Close the last category list
        echo $category;
        echo '<ul>';            
        $closeTag = '</ul>';
        $currentCategory = $category;
    }
    echo '<li>' . $value . '</li>';
}
echo '</ul>';