3

2 つの列 (entry_id と category_id) を持つ posts というテーブルがあります。

entry_id | category_id
52 | 44
55 | 47
58 | 50
55 | 55
58 | 52
53 | 51
58 | 56
61 | 56

最初に category_id 50 AND 56 (完全一致) でタグ付けされたすべてのエントリを選択し、残りを部分一致 (category_id = 50 のみでタグ付けされたエントリ、56 でタグ付けされた次のエントリなど) で並べ替えるにはどうすればよいですか?

ありがとう、

4

1 に答える 1

4

入力ごとにデータを集計してから、注文条件を適用する必要があります。

select entry_id
from posts
group by entry_id
order by max(category_id = 50) + max(category_id = 56) desc

この式は、カテゴリ 50 が混在している場合 (エントリの場合) をmax(category_id = 50)返し、そうでない場合も返します。これら 2 つの式を合計すると、カテゴリの一致数が得られます。10

(質問で示唆されているように)シングルトンマッチの順序が気になる場合は、次のようにします。

select entry_id
from posts
group by entry_id
order by max(category_id = 50) + max(category_id = 56) desc,
         max(category_id = 50) desc,
         max(category_id = 56) desc

編集:

利用可能なカテゴリをカンマ区切りのリストに保存すると、すべての世界で最高のものを手に入れることができます. カテゴリ一致数順(1位)でご注文いただけます。その後、リストを使用してカテゴリに優先順位を付けることができます。また、同じカテゴリのセットを持つすべてのエンティティが一緒に表示されるようにすることができます。文字列を操作するだけです。

表現:

count(distinct (case when find_in_set(category_id, @categories) > 0 then category_id end))

リストにある (entitY の) カテゴリの数をカウントします。

表現:

group_concat((case when find_in_set(category_id, @categories) > 0
                   then find_in_set(category_id, @categories)
              end)

要素が文字列内の位置を表す文字列を作成します。そのため、渡し'a,b,c;たエンティティが'b''c'に一致する場合、文字列は になります'2,3'。3 つすべてがあれば、 になります'1,2,3'。これにより、優先順位付けに必要なものが提供されます。

最後に、最後に追加entity_idすると、ソートが安定します。

order by count(distinct (case when find_in_set(category_id, @categories) > 0 then category_id end)) desc,
         group_concat((case when find_in_set(category_id, @categories) > 0
                            then find_in_set(category_id, @categories)
                       end)
                      order by find_in_set(category_id, @categories)),
         entry_id
于 2013-06-18T16:48:36.797 に答える