-1

我目前在表中有这样的数据:

id  |  type
------------
1   |  1
2   |  1
3   |  2
4   |  2
5   |  3
6   |  3
6   |  3

我需要显示这样的数据:

Type 1
--All type ones go here
Type 2
-- All type twos go here
Type 3
All type threes go here

我现在这样做的方式是使用两个单独的 sql 语句和循环。

select distinct type as type from table
while()
{
 select type from table where type = type;
 while()
 {

 }
}

有没有更好的方法来做到这一点并获得我想要的结果,或者使用两个循环是唯一的方法?

4

3 回答 3

3
  1. 更改您的查询,以便您使用ORDER BY type ASC.
  2. 循环遍历结果,构建一个关联数组,其中键是类型,值是 id。

现在您只有一个循环,并且可以通过关联数组中的类型访问 id。通过键循环遍历数组应该很简单,然后显示该键的所有 id。

于 2013-05-15T06:11:17.673 回答
1

GROUP_CONCAT()与 一起使用GROUP BY

SELECT
    `type`,
    GROUP_CONCAT(`id` SEPARATOR ',') as `ids`
FROM
    `table`
GROUP BY
    `type`
ORDER BY
    `type`;

在每个循环迭代中,$row['ids']可能是explode()d,例如:

<?php

while($row = $result->fetch_assoc()){
    $ids = explode(',', $row['ids']);

    echo 'Type ', $row['type'], PHP_EOL;

    if(empty($ids))continue;

    foreach($ids as $id){
        echo $id, ' ';
    }

    echo PHP_EOL;
}

?>
于 2013-05-15T06:11:19.443 回答
1

只需选择所有内容,并在遇到新类型时进行检查。这允许您仅使用一个查询在 O(n) 时间内列出所有内容。

$result = mysql_query('SELECT id, type FROM table ORDER BY type ASC');
$type = 0;
while ($row = mysql_fetch_assoc($result) {
  if ($type != $row['type']) {
    // New type found
    $type = $row['type'];
    echo "Type " + $row['type'] + "\n";
  } 
  echo "-- " + $row['id'] + "\n";
}

这会给你这样的输出

Type 1
-- 1
-- 2
Type 2
-- 3
-- 4
Type 3
-- 5
-- 6
-- 7
于 2013-05-15T06:13:29.807 回答