-1

我有一个类似的表:

ID  |  NAME    |  GROUP_ID
1   | rand_str |  4
2   | rand_str |  2
3   | rand_str |  3
4   | rand_str |  0
5   | rand_str |  3
6   | rand_str |  1
7   | rand_str |  3
8   | rand_str |  3
9   | rand_str |  1
10  | rand_str |  0

ID 是唯一 ID,名称值不为 null 并且包含 varchar 值,group_id 是最大 2 位正数。

假设查询返回此表。

我想要的是,使用 PHP,显示按其 group_id 分组的结果,如果可能的话,按编号最多到编号最少的方式对组 id 进行排序,并且“0”始终是最后一个,无论它的填充程度如何。

所以最终结果:

group id 3 存在 3 次,所以

  1. 1- id_3、id_5、id_7 和 id_8 (group_id 3)
  2. 2- id_6, id_9 (group_id 1)
  3. 3-组 id 为 4 或 2,因为两者都包含 1 个项目
  4. 4- group_id 0,即使它有 2 个项目 -> id_4,id_10

我怎样才能做到这一点?

谢谢你。

4

3 回答 3

4

使用子查询来确定每个组的计数(以及它的顺序),然​​后将其与您的数据连接以检索记录:

SELECT my_table.* FROM my_table JOIN (
  SELECT   GROUP_ID,
           IF(GROUP_ID = 0, -1, COUNT(*)) AS rank
  FROM     my_table
  GROUP BY GROUP_ID
) AS t USING (GROUP_ID)
ORDER BY t.rank DESC

sqlfiddle上查看。

然后,您将在 PHP 中循环遍历结果,跟踪GROUP_ID最后一条记录并与当前记录进行比较,以查看您现在是否在一个新组中:

$last = null;
echo "<table>";
while ($row = $stmt->fetch()) {
  if ($row['GROUP_ID'] !== $last) {
    if ($last !== null) echo "</tr>";
    echo "<tr><th scope='row'>Group " . html_entities($row['GROUP_ID']) . "</th>";
    $last = $row['GROUP_ID'];
  }
  echo "<td>ID " . html_entities($row['ID']) . "</td>";
}
echo "</tr></table>";
于 2012-05-10T12:13:36.273 回答
0

看看那里:http ://www.tizag.com/mysqlTutorial/mysqlgroupby.php

您将学习如何使用 Group By SQL 关键字 :)

于 2012-05-10T12:12:59.457 回答
-1

您可以使用以下查询执行您需要的操作

select group_concat(id),name, group_id, count(*) entries from grp
group by group_id
order by entries desc ;
于 2012-05-10T12:19:01.047 回答