Php 使用GROUPBY的MySQL循环

Php 使用GROUPBY的MySQL循环,php,mysql,Php,Mysql,这是我的桌子: Table: category ---------------- id | category ------------------ 1 | category1 2 | category2 3 | category3 4 | category4 5 | category5 - 如何获得mysql结果,如下所示: (注意:每个类别(1-5)仅分配一个标题,然后再次重复类别循环。) 我试过使用“按顺序分组” Category 1 === titl

这是我的桌子:

Table: category
----------------
id | category 
------------------
1  |  category1 
2  |  category2
3  |  category3
4  |  category4
5  |  category5
-

如何获得mysql结果,如下所示:

(注意:每个类别(1-5)仅分配一个标题,然后再次重复类别循环。)

我试过使用“按顺序分组”

Category 1     ===
   title 1


 Category 2
   title

 Category 3
    title 5


Category 4
     title 3

Category 5
     title 4

Category 1     ===
     title 9

Category 2
     title 

category 3
      title 6

 category 4
       title10

 category 5
       title 8

 category 1      ===
       title 11

  category 2
        title 12

如果您想使用PHP构建这种格式,也可以使用while循环来创建它。考虑这个例子:

$results_from_db = array(
    array('id' => 1, 'category' => 'category1', 'title' => 'title 1', 'category_id' => 1),
    array('id' => 1, 'category' => 'category1', 'title' => 'title 9', 'category_id' => 1),
    array('id' => 1, 'category' => 'category1', 'title' => 'title 11', 'category_id' => 1),
    array('id' => 2, 'category' => 'category2', 'title' => 'title 2', 'category_id' => 2),
    array('id' => 2, 'category' => 'category2', 'title' => 'title 7', 'category_id' => 2),
    array('id' => 2, 'category' => 'category2', 'title' => 'title 12', 'category_id' => 2),
    array('id' => 3, 'category' => 'category3', 'title' => 'title 5', 'category_id' => 3),
    array('id' => 3, 'category' => 'category3', 'title' => 'title 6', 'category_id' => 3),
    array('id' => 4, 'category' => 'category4', 'title' => 'title 3', 'category_id' => 4),
    array('id' => 4, 'category' => 'category4', 'title' => 'title 10', 'category_id' => 4),
    array('id' => 5, 'category' => 'category5', 'title' => 'title 4', 'category_id' => 5),
    array('id' => 5, 'category' => 'category5', 'title' => 'title 8', 'category_id' => 5),
);


$ids = array();
foreach($results_from_db as $value) {$ids[] = $value['id'];}
$ids = array_values(array_unique($ids));
sort($ids);
$needle_key = 0;

// build the data (kinda like recursive searching)
$data = array();
while(true) {
    $current_value = array_shift($results_from_db);
    if($current_value['category_id'] == $ids[$needle_key]) {
        $data[] = $current_value;
        $needle_key++;
        if($needle_key > count($ids)-1) {
            $needle_key = 0; // resetter
        }
    } else {
        array_push($results_from_db, $current_value);
    }

    if(empty($results_from_db)) {
        break;
    }
}
?>

<!-- if you want to echo -- >
<?php foreach($data as $key => $value): ?>
    <?php echo '<strong>'.$value['category'].'</strong><br/>'; ?>
    <?php echo str_repeat('&nbsp;', 8) . $value['title'].'<br/><br/>'; ?>
<?php endforeach; ?>
首先,您需要一起正确地查询这些值,您可以使用join

// SAMPLE => SELECT * FROM `category` 
//    LEFT JOIN `news` ON `news`.`category_id` = `category`.`id`
样本输出:

其次,在获得值之后,您需要对它们进行排序,在本例中,
(1,2,3,4,5)

考虑这个例子:

$results_from_db = array(
    array('id' => 1, 'category' => 'category1', 'title' => 'title 1', 'category_id' => 1),
    array('id' => 1, 'category' => 'category1', 'title' => 'title 9', 'category_id' => 1),
    array('id' => 1, 'category' => 'category1', 'title' => 'title 11', 'category_id' => 1),
    array('id' => 2, 'category' => 'category2', 'title' => 'title 2', 'category_id' => 2),
    array('id' => 2, 'category' => 'category2', 'title' => 'title 7', 'category_id' => 2),
    array('id' => 2, 'category' => 'category2', 'title' => 'title 12', 'category_id' => 2),
    array('id' => 3, 'category' => 'category3', 'title' => 'title 5', 'category_id' => 3),
    array('id' => 3, 'category' => 'category3', 'title' => 'title 6', 'category_id' => 3),
    array('id' => 4, 'category' => 'category4', 'title' => 'title 3', 'category_id' => 4),
    array('id' => 4, 'category' => 'category4', 'title' => 'title 10', 'category_id' => 4),
    array('id' => 5, 'category' => 'category5', 'title' => 'title 4', 'category_id' => 5),
    array('id' => 5, 'category' => 'category5', 'title' => 'title 8', 'category_id' => 5),
);


$ids = array();
foreach($results_from_db as $value) {$ids[] = $value['id'];}
$ids = array_values(array_unique($ids));
sort($ids);
$needle_key = 0;

// build the data (kinda like recursive searching)
$data = array();
while(true) {
    $current_value = array_shift($results_from_db);
    if($current_value['category_id'] == $ids[$needle_key]) {
        $data[] = $current_value;
        $needle_key++;
        if($needle_key > count($ids)-1) {
            $needle_key = 0; // resetter
        }
    } else {
        array_push($results_from_db, $current_value);
    }

    if(empty($results_from_db)) {
        break;
    }
}
?>

<!-- if you want to echo -- >
<?php foreach($data as $key => $value): ?>
    <?php echo '<strong>'.$value['category'].'</strong><br/>'; ?>
    <?php echo str_repeat('&nbsp;', 8) . $value['title'].'<br/><br/>'; ?>
<?php endforeach; ?>

你能解释一下显示结果的模式吗?你想重复第1-5类,浏览所有的标题吗?@Sean:是的。。重复类别1-5为什么
category 2
category 3
第一次缩进一个额外的空格?这就是你想要的吗?根据结果创建一个二维数组,其中第一个维度是类别,第二个维度是类别中所有元素的数组。然后在类别中循环,将一个项目从子数组中移出并打印出来。OP想要类别1到类别5,只分配一个标题,然后再次重复类别循环。
category1
        title 1

category2
        title 2

category3
        title 5

category4
        title 3

category5
        title 4

category1
        title 9

category2
        title 7

category3
        title 6

category4
        title 10

category5
        title 8

category1
        title 11

category2
        title 12