1

問題を説明する前に、テーブルの構造を簡単に説明します。

タイプ:MySQL投稿/トピックテーブル:

 int      int**     UNIX Time     Int        Int
--------------------------------------------------
| id | category | postdate | topic_id | is_topic |
--------------------------------------------------
|  1 |    a     | 12345678 |    1     |     1    |
--------------------------------------------------
|  2 |    a     | 12345678 |    1     |     0    |
--------------------------------------------------
|  3 |    b     | 12345678 |    3     |     1    |
--------------------------------------------------
|  4 |    b     | 12345678 |    3     |     0    |
--------------------------------------------------
|  5 |    c     | 12345678 |    5     |     1    |
--------------------------------------------------
|  6 |    c     | 12345678 |    5     |     0    |
--------------------------------------------------

**表を読みやすくするために文字を使用しています

カテゴリごとに最新の4行を取得しようとしていますが、GROUP BYを使用して各カテゴリから最新の1行を取得できますが、カテゴリごとに複数を取得する方法がわかりません。

私はこのようなことを試しました:

SELECT *
FROM posts p
WHERE NOT EXISTS
(
    SELECT *
    FROM posts
    WHERE category = p.category
    LIMIT 4
)

また、SOで他の回答を提供してくれた他の回答のいくつかを使用してみましたが、目的に合わせることができなかったようです。

これらのより複雑なクエリに関しては、mysqlは私の強力な側面ではないため、ここでは完全に失われています。

正しい方向へのヘルプやポインタは本当にありがたいです!

ありがとう!

更新:カテゴリの数は静的ではなく、変更されることに注意してください。

4

1 に答える 1

2

このような何かはおそらくするでしょう:

select * from
    (select 
         @rank:=CASE WHEN @ranked <> category THEN 1 ELSE @rank+1 END as rank,
         id,
         category,
         postdate,
         topic_id,
         is_topic
         @ranked:=category
     from 
          (select @rank := -1) a, 
          (select @ranked :=- -1) b, 
          (select * from posts order by category, postdate desc) c
    ) ranked_posts
where ranked_posts.rank <= 4

基本的に、ここで起こっていることは、他のエンジンに存在する「ランク付け」関数を作成しようとしていることです(MS SQLが念頭に置いています)。

クエリは、カテゴリ、投稿日順に並べられたすべての投稿を調べ、すべての行に「ランキング」番号を追加して、カテゴリが変更されたときにランクをリセットします。好き:

rank | category  
1          a     
2          a     
...
100        a     
1          b 
2          b
1          c
2          c
3          c

これを「サブクエリ」内で実行してテーブルを模倣し、ランクが4未満の行(必要な行)を選択するだけです。多かれ少なかれ必要な場合は、その数を調整できます。

覚えておくべきことの1つは、順序が重要であるか、ランクがすべて台無しになるということです。カテゴリは「グループ化」する必要があるため、ORDER BY category次にグループを基準順に並べ替えますpostdate desc

于 2012-09-27T19:01:56.123 に答える