-1

テーブル

id Category Name
1  Sports   name1
2  Food     name2
3  Sports   name3
4  Social   name4
5  TV       name5
6  Food     name6
7  Sports   name7
8  TV       name8

* 最も言及されたカテゴリで並べ替えて * クエリを実行するにはどうすればよいですか? 結果は次のようになります。

Sports name1
Sports name3
Sports name7
Food name2
Food name6

and so.
4

1 に答える 1

0

各カテゴリの言及回数

SELECT category, COUNT(*) AS cat_count
  FROM anonymous_table
 GROUP BY category

要求どおりにソートされたデータ

SELECT a.category, a.name
  FROM anonymous_table AS a
  JOIN (SELECT category, COUNT(*) AS cat_count
          FROM anonymous_table
         GROUP BY category
       ) AS c ON a.category = c.category
 ORDER BY c.cat_count DESC, a.name 

何らかの理由で、それは仕事をしていません。

上記の SQL を Informix で試したところ、「うまくいきました」が、予期しないが説明可能な答えが得られました。

Sports    name1
Sports    name3
Sports    name7
Food      name2
TV        name5
Food      name6
TV        name8
Social    name4

Food 行をグループ化するものは何もなく、名前の並べ替えにより、実際にそれらを分離する必要がありました。したがって、ORDER BY 句には追加の条件が必要です。

SELECT a.category, a.name
  FROM anonymous_table AS a
  JOIN (SELECT category, COUNT(*) AS cat_count
          FROM anonymous_table
         GROUP BY category
       ) AS c ON a.category = c.category
 ORDER BY c.cat_count DESC, a.category, a.name;

これにより、妥当な結果が得られます。

Sports    name1     
Sports    name3     
Sports    name7     
Food      name2     
Food      name6     
TV        name5     
TV        name8     
Social    name4     

食事の前にテレビが必要な場合は、そのための注文方法を考え出す必要があります。この例では、カテゴリの降順で並べ替えることができます。異なるカテゴリの準任意の順序付けの一般的なケースでは、カテゴリ テーブルと、他の基準が同じ:

CREATE TABLE Category(Name CHAR(10) NOT NULL PRIMARY KEY, Ordering INTEGER NOT NULL);
INSERT INTO Category(Name, Ordering) VALUES('Sports', 10);
INSERT INTO Category(Name, Ordering) VALUES('TV',     20);
INSERT INTO Category(Name, Ordering) VALUES('Food',   30);
INSERT INTO Category(Name, Ordering) VALUES('Social', 40);

SELECT a.category, a.name
  FROM anonymous_table AS a
  JOIN category        AS b ON a.category = b.name
  JOIN (SELECT category, COUNT(*) AS cat_count
          FROM anonymous_table
         GROUP BY category
       ) AS c ON a.category = c.category
 ORDER BY c.cat_count DESC, b.ordering, a.category, a.name;

Category.Name 列には一意の制約がないため、正しいグループ化を確実にするために、カテゴリごとに並べ替える必要があります (ただし、一意の制約を追加a.categoryしてから、ORDER BY 句から用語を削除することもできます)。

于 2013-01-26T03:01:07.620 に答える