私はポストは、タグ(多対多の関係を)与えられた関係を表す以下の3つのテーブルがあるとします。クエリ(多対多の関係)
create table posts (id integer, content text, primary key (id));
create table tags (tag varchar(30), description text, primary key (tag));
create table post_tags (post_id integer, tag varchar(10),
primary key (post_id, tag),
foreign key (post_id) references posts (id),
foreign key (tag) references tags (tag));
を
ここで、正確に{clever、interesting}のタグを含むすべての投稿を探したいとします。
私の試みは失敗です。それは{clever、interesting}のタグを持つ投稿を見つけるが、{clever、interesting、noyoying}や{clever、interesting、unethical}のタグを持つ投稿も見つける。
select t1.post_id from post_tags as t1
inner join post_tags as t2 on t2.post_id=t1.post_id
where t1.tag='clever' and t2.tag='interesting';
この操作を簡単にするために構造を変更するための提案はありません。しかし、私はposts
テーブルにカンマで区切ったタグのリストを追加するようなことは避けたい。
'tags'には' post_id'が含まれていません。これは '実行エラー'である必要があります。また、 '興味深い'には11文字が含まれています。これは 'varchar(10)'の問題かもしれません。おそらく 'tag 'を別のintベースのフィールドにして' description 'フィールドを使うか、大きい、ユニークな) '名前'フィールド。 –
''interesting' 'は' VARCHAR(10) 'フィールドの中にどのように格納されていますか? –
あなたが必要とするのは、[余りのない完全な関係分割]です。(http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/ )。あなたがMySQLを使っているとき、私は実際に 'GROUP_CONCAT'がどのようにこれを実行するのかを調べます。 –