0

ここに私のデータベースのカテゴリテーブルからのデータがあります

Category_Name     | SubCategory_Name
Category1         | Vegetarian
Category1         | Seafood
Category1         | Lamb
Category2         | Vegetarian 
Category2         | Chicken 
Category3         | Non-Vegetarian
Category3         | Vegetarian
Category3         | Chicken
Category4         | Lamb/Goat
Category4         | Seafood
Category5         | Vegetarian
Category5         | Non-Vegetarian 
Category6         | 
Category7         | Non-Vegetarian
Category7         | Vegetarian 

空白の値は「サブカテゴリがない」ことを意味しますが、これらのカテゴリの結果は、カテゴリ名のみを示す行として表示される必要があります

次のような結果を表示するクエリを書きたいと思います。

Category_Name | SubCategory_Name 1 | SubCategory_Name 2 | SubCategoryName3 
4

1 に答える 1

0

クエリ テキストは、返される列の数を事前に「知っている」必要があります。Category_Name あたりの SubCategory_Name の最大数は 3 ですか?

不確定な数を処理するには、次のように GROUP_CONCAT 関数を使用して、それらを 1 つの列に結合できます。

SELECT Category_Name
     , GROUP_CONCAT(DISTINCT SubCategory_Name ORDER BY SubCategory_Name) AS sc
  FROM mytable
 GROUP BY Category_Name

それらを別の列として返すには、さらに作業が必要になります。最初に、返される列の数に「上限」を設定する必要があります。

最初に個別の Category_Name のリストを取得し、次にそれらのそれぞれに対して相関サブクエリを実行して、1 番目、2 番目、3 番目などを取得します。それぞれに関連付けられた SubCategory_Name です。

これは、大きなセットでは非常に非効率的ですが、小さなセットでは適切に機能し、指定された結果セットを返します。

SELECT g.Category_Name
     , ( SELECT s1.SubCategory_Name
           FROM mytable s1
          WHERE s1.Category_Name = t.Category_Name
          GROUP BY s1.SubCategory_Name
          ORDER BY s1.SubCategory_Name
          LIMIT 0,1
       ) AS `SubCategory_Name 1`
     , ( SELECT s2.SubCategory_Name
           FROM mytable s2
          WHERE s2.Category_Name = t.Category_Name
          GROUP BY s2.SubCategory_Name
          ORDER BY s2.SubCategory_Name
          LIMIT 1,1
       ) AS `SubCategory_Name 2`
     , ( SELECT s3.SubCategory_Name
           FROM mytable s3
          WHERE s3.Category_Name = t.Category_Name
          GROUP BY s3.SubCategory_Name
          ORDER BY s3.SubCategory_Name
          LIMIT 2,1
       ) AS `SubCategory_Name 3`
  FROM ( SELECT t.Category_Name
           FROM mytable t 
          GROUP BY t.Category_Name
       ) g
 ORDER BY g.Category_Name

4 番目、5 番目などのサブカテゴリを返すには、相関サブクエリをコピーしてLIMIT 3,1、4 番目、 LIMIT 4,15 番目、5 番目を取得するように変更します。

于 2013-07-12T16:54:00.890 に答える