-2

簡単にするために、問題に関係のないフィールドは残しておきます。

私のテーブル構造は、

ニュース

news_id | parent_category | child_category

カテゴリー

category_id | maincategory_name

サブカテゴリ

subcategory_id | subcategory_name

すでに明らかなように、テーブルにcategory_idリンクされてparent_idおり、テーブルsubcategory_idにリンクされています。child_categorynews


私が今持っているもの

SELECT * 
 FROM (

       SELECT news . * , @rn := 
       CASE WHEN @child_category = child_category
       THEN @rn +1
       ELSE 1 
       END AS rn, @child_category := child_category
       FROM news, (

                   SELECT @rn :=0, @child_category := NULL
                   ) AS vars
                       ORDER BY child_category
                   ) AS T1

                        LEFT JOIN category ON parent_category = category.category_id
                        LEFT JOIN subcategory ON child_category =  
                        subcategory.subcategory_id
                        WHERE rn <=12 AND parent_category = (SELECT category_id FROM 
                        category WHERE maincategory_name='ukraine') AND 
                        child_category!= (SELECT `subcategory_id` FROM subcategory 
                        WHERE `subcategory_name` = 'kiev')
                        ORDER BY category.category_id DESC

上記のSQLは機能し、各カテゴリから12行をフェッチします。

問題 私が今直面している問題は、クエリがすべてのカテゴリからデータをフェッチすることです。そして、このカテゴリ番号を2または3に制限したいと思います。たとえば、subcategoryテーブルに8つのサブカテゴリがある場合、それらすべてからデータをフェッチします。そして、フェッチを制限、たとえば3(任意の3つのカテゴリ)に制限したいと思います。

IN次のような文を使ってみましたが、

SELECT * 
     FROM (

       SELECT news . * , @rn := 
       CASE WHEN @child_category = child_category
       THEN @rn +1
       ELSE 1 
       END AS rn, @child_category := child_category
       FROM news, (

                   SELECT @rn :=0, @child_category := NULL
                   ) AS vars
                       ORDER BY child_category
                   ) AS T1

                        LEFT JOIN category ON parent_category = category.category_id
                        LEFT JOIN subcategory ON child_category =  
                        subcategory.subcategory_id
                        WHERE rn <=12 AND parent_category = (SELECT category_id FROM 
                        category WHERE maincategory_name='ukraine') AND 
                        child_category IN (2,4)
                        ORDER BY category.category_id DESC

ここで、IN rangeはサブクエリによって取得されます。論理的には、そのサブクエリを3つの結果に制限すると、私の仕事は完了です。しかし、結局のところ、ステートメントはサブクエリ内の句をINサポートしていません。LIMIT

したがって、質問は、限られた数のカテゴリからデータを取得する際の回避策は何ですか(修正されていますが、私はすでに理解しています)。


同じデータ

ニューステーブル

| news_id | parent_category | child_category
|   1     |       1         |     1
|   2     |       1         |     2

カテゴリ表

| category_id | maincategory_name
|      1      |      Ukraine
|      2      |      Russia
|      3      |      Belarus

サブカテゴリテーブル

| subcategory_id | subcategory_name
|        1       |     Kiev
|        2       |     Odessa
|        3       |     Moscow
|        4       |     Simferopol
|        5       |     Dnipropetrovsk

結果は次のようになります。

Kiev、Odessa、simferopol、Dnipropetrovskがメインカテゴリ1、つまりウクライナに行き、Kievを除く2つのカテゴリが必要だとします(つまり、結果にはsimferopolDniproまたはOdessaDniproまたはOdessasimferopolのいずれかが含まれている必要があります)

問題は、クエリが3つのカテゴリすべて(利用可能な場合はそれ以上)をフェッチすることですが、必要なのは2つ(または3つ)だけです。

詳細情報


SQLフィドル

create table News(news_id int, parent_category int, child_category int);
insert into News values (1,1,1), (2,1,2), (3,1,2), (4,1,4),(5,1,4), (6,1,5), (7,2,3), (8,1,5), (9,1,2);
create table Category(category_id int, maincategory_name varchar(100));
insert into Category values (1, 'Ukraine'), (2, 'Russia'), (3, 'Belarus');
create table Subcategory (subcategory_id int, subcategory_name varchar(100));
insert into Subcategory values (1, 'Kiev'), (2, 'Odessa'), (3, 'Moscow'), (4, 'Simferopol'), (5, 'Dinipro');

サンプルデータ

ここに画像の説明を入力してください

ゴール

上記の結果から、私は次のことを達成したいと思います。

  • フェッチ結果は1つの主要なカテゴリ(つまり、ここではウクライナでロシアを削除)からのみ取得されますが、簡単に実行できるため、その部分について心配する必要はありません。

  • 2つのサブカテゴリのみをフェッチします(上記のセットには3つのサブカテゴリが含まれています。Odessa、simferopol、Dnipro。そのうちの2つだけが必要です)。それを取得するためにハードコーディングすることはできますが、他の場所でも同じクエリを使用するため、ハードコーディングするとその目的が無効になります。

  • 上記でフェッチされた上記の2つのサブカテゴリのそれぞれから、各サブカテゴリから最大5行を取得する必要があります。(私は私の質問の最初のクエリでそれを達成しました)。

上記の2つの要件から、私は達成していません。1といいえ。3.私が立ち往生している場所は2番です。結果セットから、2つのサブカテゴリのみを含む結果をフェッチできません。結果セットは、使用可能なすべてのカテゴリを含むデータを出力します。(ここでは、3つのサブカテゴリのみであるため、結果には3つすべてが含まれます。10個のサブキャットがある場合、10個のサブキャットデータすべてが取得されます)。もう少し明確になりたいと思います。

4

1 に答える 1

0

私はあなたが望むものをまだ手に入れられないかもしれないのではないかと心配しています. 単純に a を使用しないのはなぜGROUP BYですか?

/* SELECT * FROM ( */
SELECT 
n.news_id,
c.maincategory_name,
sc.subcategory_name
FROM
News n
INNER JOIN Category c ON n.parent_category = c.category_id
INNER JOIN Subcategory sc ON n.child_category = sc.subcategory_id
WHERE maincategory_name = 'Ukraine'
GROUP BY maincategory_name, subcategory_name
ORDER BY RAND()
LIMIT 2
/* )q1 INNER JOIN with_whatever ON q1.news_id = with_whatever.Id */

テーブルwith_whateverには、「各サブカテゴリから最大 5 行を取得する必要がある」取得元のデータが保持されます。あなたのサンプルデータはまだそれを反映していません。それがあなたが求めているものであるかどうか、私は確信が持てない理由です。

于 2012-09-24T13:56:13.537 に答える