db查询的特殊分组和列表

时间:2012-05-10 12:09:55

标签: php mysql

我有一张类似于:

的表格
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,名称valie不为null且包含varchar值,group_id是最多2位数的正数。

假设查询返回此表。

我想要的是,使用PHP,显示按group_id分组的结果,如果可能的话,将编号最多的编号排序到最少编号,“0”始终是最后一个,无论它是多少填充。

结束了结果:

组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
  5. 我怎样才能做到这一点?

    谢谢。

3 个答案:

答案 0 :(得分: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>";

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

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

select group_concat(id),name, group_id, count(*) entries from grp
group by group_id
order by entries desc ;