0

私のテーブル

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

ご覧のとおり、各要素 Name にはカテゴリがあります。現時点でのクエリは次のとおりです。

SELECT * FROM interests ORDER BY category DESC;

次に、PHP でカテゴリ別にグループ化し、それぞれの名前フィールドで上位 3 つを数えます。私は同じことをしたいのですが、MySQL (可能であれば) では、大量のデータがあり、毎回すべてのテーブルをクエリしたくないので、カテゴリの量を上位 3 つに制限したいと考えています。 2までの名前。

私は試しました: SELECT *,COUNT(*) as catnumber FROM interests GROUP BY category ORDER BY catnumber DESCLIMIT 5 ただし、名前要素が 1 つの上位 5 つのカテゴリを教えてください (可能な場合は最大 2 つ必要です)。したがって、結果は multiarray の結果のようなものになるはずです:

Categories = array('Sports' => array('name1', 'name3','name7'), 'Food' => array('name2','name6'), 'TV' => array('name5','name8'))

これは可能ですか?

4

4 に答える 4

0

GROUP_CONCATを使用してこれを行い、次のカテゴリを展開できます。,

SELECT `category`,
       count(id) AS entries,
       GROUP_CONCAT(NAME)
FROM `interests` l1
GROUP BY `category`
ORDER BY entries DESC LIMIT 3;
于 2013-01-26T00:28:06.183 に答える
0

MySQL は「マルチアレイ」の結果を返しません。

ただし、次のようなクエリを使用して、それぞれ最大 2 つの名前を持つ 3 つのカテゴリを取得できます。

SELECT c.category
     , (SELECT n1.name
          FROM interests n1
         WHERE n1.category = c.catetory
         ORDER BY n1.name
         LIMIT 0,1
       ) AS n1
     , (SELECT n2.name
          FROM interests n2
         WHERE n2.category = c.catetory
         ORDER BY n2.name
         LIMIT 1,1
       ) AS n2
  FROM ( SELECT t.category
              , COUNT(1) AS cnt
           FROM interests t
          GROUP BY t.category
          ORDER BY cnt DESC
              , t.category
          LIMIT 3
       ) c

次のような結果セットが返されます。

    カテゴリ n1 n2
    -------- ---- ----
    スポーツ名1名3
    食品名2名6
    テレビ名5名8

別の行で名前を取得することもできますが、クエリはもう少し複雑です。

SELECT c.category
     , CASE WHEN i.i = 1 THEN 
       (SELECT n1.name
          FROM interests n1
         WHERE n1.category = c.catetory
         ORDER BY n1.name
         LIMIT 0,1
       ) ELSE
       (SELECT n2.name
          FROM interests n2
         WHERE n2.category = c.catetory
         ORDER BY n2.name
         LIMIT 1,1
       ) END AS `name`
  FROM ( SELECT t.category
              , COUNT(1) AS cnt
           FROM interests t
          GROUP BY t.category
          ORDER BY cnt DESC
              , t.category
          LIMIT 3
       ) c
 CROSS
  JOIN (SELECT 1 AS i UNION ALL SELECT 2) i
 ORDER BY c.cnt DESC, t.category, i.i

NULL 値が返されないようにするために、ORDER BY の前に HAVING 句を追加できます。

HAVING n IS NOT NULL

それは返されるはずです:

    カテゴリーn
    -------- ----
    スポーツ名1
    スポーツ名3
    食品名2
    食品名6
    テレビ名5
    テレビ名8
于 2013-01-26T00:18:05.320 に答える
0

これを試して:

    SELECT a.category, SUBSTRING_INDEX(GROUP_CONCAT(distinct(a.NAME)   SEPARATOR ', '),",",2) AS `Top names`
    FROM MyTable AS A JOIN 
        (SELECT category 
        FROM MyTable 
        GROUP BY category 
        ORDER BY count(category) DESC 
        LIMIT 3) AS C
    ON A.category = C.category 
    GROUP BY a.category 
    ORDER BY  count(a.category) DESC, count(A.name)  DESC ;

SQL FIDDLE デモ

カテゴリの上部のサイズは現在 3 で、名前の上部のサイズは現在 2 です。値を変更することで、上部のサイズを調整できます。カテゴリと名前が抽選の場合、2 番目のカテゴリまたは名前は表示されないことに注意してください。

于 2013-01-26T02:33:54.793 に答える
0

MySQL クエリから直接多次元配列を取得することはできません。テーブル構造と目的の出力の説明を理解している場合は、配列を次のように概算できます。

SELECT id,
       Category,
       (SELECT 
        GROUP_CONCAT(Name SEPARATOR ',') 
        FROM interests AS sint 
        WHERE sint.Category = interests.Category) as Name,
       (SELECT 
        COUNT(Name) 
        FROM interests AS csint 
        WHERE csint.Category = interests.Category) as count
FROM interests 
GROUP BY Category
HAVING count >= 2
ORDER BY count DESC,CATEGORY
LIMIT 3

これにより、次のようになります。

id  Category    Name           count
1   Sports    name1,name3,name7     3
2   Food      name2,name6           2
5   TV        name5,name8           2

以下のコメントで要求されているようにテーブル全体を並べ替えるには、次を使用します。

SELECT id,
       Category,
       Name,
       (SELECT 
        COUNT(Name) 
        FROM interests AS csint 
        WHERE csint.Category = interests.Category) as count
FROM interests 
ORDER BY count DESC,Category
于 2013-01-26T00:48:37.813 に答える