0

確かに共通の問題があります。「n」個のタグを持つエンティティを検索するクエリを作成したいと思います。したがって、最も単純なケースでは、"hey" というタグを持つすべてのエンティティを見つけます。より複雑なケースでは、"hey"、"hi"、"howdy" のすべてのタグを持つすべてのエンティティを見つけます。

タグ テーブルに 3 回参加する必要があり、3 つの異なるエイリアスを作成する必要があるようです。抽象的なケースでは、N 個の異なるエイリアスを作成する必要があります。これを達成するためのより簡単な方法はありますか?

私が尋ねている理由は、タグだけでなく、さまざまなことに対してこれを行うクエリを書く必要があるからです。だから私は基本的にNxMエイリアスに参加するつもりです...これはクエリを書く(そして調整する)のが面倒です。

ヘルプ?

編集:

どうでも。私は解決策を見つけました:

select distinct g.id, g.description
FROM gallery g
 inner join gallery_to_tag g2t_0
  on g2t_0.gallery_id = g.id
 inner join tag t_0
  on t_0.id = g2t_0.tag_id and t_0.term = 'hi'

 inner join gallery_to_tag g2t_1
  on g2t_1.gallery_id = g.id
 inner join tag t_1
  on t_1.id = g2t_1.tag_id and t_1.term = 'hey'
4

3 に答える 3

0

スキーマなしで正確な答えを提供することは困難ですが、特定のアイテムにクエリ対象のすべてのタグが含まれていることを確認する方法を尋ねていると思います。あなたは次のようなことをすることができます

Select ..
From MainTable
Where Exists    (
                Select 1
                From TagsTable
                Where TagsTable.FK = MainTable.PK
                    And TagsTable.Tag In('hey','hi','howdy')
                Having Count(*) = 3
                )
于 2010-07-05T18:11:27.273 に答える
0

これはあなたが探しているかもしれないものですか。スキーマを見ずに見分けるのは難しい

CREATE TEMPORARY TABLE `checktags` (
  `checkme` varchar(100) NOT NULL,
  KEY `checkme` (`checkme`)
) ENGINE=MyISAM;

//INSERT ALL TAGS TO CHECK

SELECT * FROM `table` 
LEFT JOIN `tags` ON `table_id` = `tag_table_id` 
WHERE `tag` IN (SELECT `checkme` FROM `checktags`);
于 2010-07-05T18:03:19.470 に答える
0

テーブルの結合を避けたい場合は、いくつかのサブクエリが必要になります。したがって、N 個のタグの場合、N 個のサブクエリが必要になります。

SELECT * FROM Entities
WHERE id IN (SELECT entity_id FROM tags WHERE tag = 'Hey')
AND id IN (SELECT entity_id FROM tags WHERE tag = 'Hello')
AND ...

同様に、必要なタグのいずれかを持つエンティティを選択できます。

SELECT * FROM Entities
WHERE id IN (SELECT entity_id FROM tags WHERE tag = 'Hey')
OR id IN (SELECT entity_id FROM tags WHERE tag = 'Hello')
OR ...
于 2010-07-05T18:21:19.360 に答える