なぜそれにgroup_concatを使用しますか?与えられたタグxについて、あなたは項目のリストを選択するのが速いと言った。アイテムのリストを見ると、すべてのタグが高速になるはずです。通常、何らかの制限がないのは、通常のウェブサイトでは1ページに100000のエントリが表示されないということです。
私がお勧めします:
drop temporary table if exists lookup_item;
create temporary table lookup_item (item_id serial, primary key(item_id));
insert into lookup_item select i.id as item_id
from items i
where exists (select * from items_tags where item_id = i.id and tag_id = <tag_id>)
and <other conditions or limits>;
select * from lookup_item
inner join items_tags it on it.item_id = i.id
inner join tags t on t.id = it.tag_id
order by i.<priority>, t.<priority>
優先順位は、アイテムやタグの重要性のいくつかの種類のために、最後に修正することができます。
それから、あなたはタグ付きのすべてのアイテムを取得します。コード内の唯一の作業は、結果行に次の項目があるかどうかを確認することです。
サンプルレコードを提供できますか? –
だから、最大5つのタグに質問を限定することでこの問題を解決するようです。そして、タグを扱う際にGROUP_CONCAT()を全く使用していると思うのはなぜですか? – Barmar
@Barmar:SO上のタグの制限はパフォーマンス上の理由ではなく、[質問に集中する](http://meta.stackexchange.com/a/34743)。 [SOのスキーマ](http://meta.stackexchange.com/a/2678)では、タグは正規化された方法(PostTags'テーブル)と非正規化された方法(Posts.Tags 'フィールド) - 後者は、ポスト自身でポストのタグを検索するのが非常に速くなりますが、前者は特定のタグの組み合わせを持つポストを簡単に検索できます。 – eggyal