簡単にするために、問題に関係のないフィールドは残しておきます。
私のテーブル構造は、
ニュース
news_id | parent_category | child_category
カテゴリー
category_id | maincategory_name
サブカテゴリ
subcategory_id | subcategory_name
すでに明らかなように、テーブルにcategory_id
リンクされてparent_id
おり、テーブルsubcategory_id
にリンクされています。child_category
news
私が今持っているもの
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つのカテゴリが必要だとします(つまり、結果にはsimferopolとDniproまたはOdessaとDniproまたはOdessaとsimferopolのいずれかが含まれている必要があります)
問題は、クエリが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個のサブキャットデータすべてが取得されます)。もう少し明確になりたいと思います。