-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、name valie は null ではなく、varchar 値を含み、group_id は最大 2 桁の正の数です。

クエリがこのテーブルを返すとしましょう。

私が望むのは、PHP を使用して、group_id でグループ化された結果を表示し、可能であれば、グループ 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 のいずれか
  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 に答える