UNION句に追加したい新しいタグを追加すると、それは遅くなり、遅くなります。各UNION句は、計画して実行する必要がある追加のクエリです。さらに、完了したらソートすることもできません。
基本的なデータウェアハウジング手法を探しています。まず、追加のテーブルを1つ追加してスキーマを再作成してみましょう。
create table a (document_id int, tag varchar(10));
insert into a values (1, 'tag1'), (1, 'tag2'), (1, 'tag3'), (2, 'tag2'),
(3, 'tag1'), (3, 'tag2'), (4, 'tag1'), (5, 'tag3');
create table b (tag_group_id int, tag varchar(10));
insert into b values (1, 'tag1'), (1, 'tag2'), (2, 'tag3');
表bには「タググループ」が含まれています。グループ1はtag1とtag2を含み、グループ2はtag3を含む。
今はあなたが興味のあるクエリを表現するために、テーブルbを変更することができ、あなたが照会する準備ができたら、あなたは集計データを保存するために一時テーブルを作成します。
create temporary table c
(tag_group_id int, count_tags_in_group int, tags_in_group varchar(255));
insert into c
select
tag_group_id,
count(tag),
group_concat(tag)
from b
group by tag_group_id;
create temporary table d (document_id int, tag_group_id int, document_tag_count int);
insert into d
select
a.document_id,
b.tag_group_id,
count(a.tag) as document_tag_count
from a
inner join b on a.tag = b.tag
group by a.document_id, b.tag_group_id;
を今すぐcはのためのタグの数が含まれていますタグは、各文書が各タググループに対して有するタグの数を含む。 cの行がdの行と一致する場合、その文書はそのタググループ内のすべてのタグを持つことを意味します。このアプローチについて
select
d.document_id as "Document ID",
c.tags_in_group as "Matched Tag Group"
from d
inner join c on d.tag_group_id = c.tag_group_id
and d.document_tag_count = c.count_tags_in_group
一つのクールなことは、あなたがこれらのタググループのそれぞれのタグの50%以上を持っているどのように多くの文書」のようなレポートを実行できることがありますか?'
select
d.document_id as "Document ID",
c.tags_in_group as "Matched Tag Group"
from d
inner join c on d.tag_group_id = c.tag_group_id
and d.document_tag_count >= 0.5 * c.count_tags_in_group