1

我有两个表:对象和标签。我创建了一个名为 objects_tags 的交叉表(对不起,我不熟悉术语...),其中每个与对象关联的标签都有一行。对象可能有许多标签,标签可能与许多对象相关联。

所以,对象可能看起来像这样

  +--------+----------------------------------------+
  | Object | Data                                   |
  |--------|----------------------------------------|
  |Object1 | Lorem Ipsum                            |
  |Object2 | Lorem Ipsum                            |
  |Object3 | Lorem Ipsum                            |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  +--------+----------------------------------------+

数据无所谓。标签看起来基本相同,例如:

  +--------+----------------------------------------+
  | Tag    | Data                                   |
  |--------|----------------------------------------|
  |Tag1    | Lorem Ipsum                            |
  |Tag2    | Lorem Ipsum                            |
  |Tag3    | Lorem Ipsum                            |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  |        |                                        |
  +--------+----------------------------------------+

我的“交叉表”看起来像

  +--------+----------------------------------------+
  | Object | Tag                                    |
  |--------|----------------------------------------|
  |Object1 | Tag1                                   |
  |Object2 | Tag1                                   |
  |Object2 | Tag2                                   |
  |Object1 | Tag3                                   |
  |Object3 | Tag2                                   |
  |Object3 | Tag3                                   |
  |        |                                        |
  |        |                                        |
  +--------+----------------------------------------+

我想做的是获取所有同时具有 Tag1 和 Tag2 的对象(例如)。在这里,我只会返回 object2。

不起作用的 MySQL 命令是这样的:

SELECT * FROM objects JOIN objects_tags ON objects_tags.id=objects.id WHERE ( objects_tags.tag = ? AND objects_tags.tag = ? )

? 被替换为我要搜索的标签,包装为 PDO。此查询不返回任何内容,因为从联接返回的单行没有多个关联的标签,并且我请求匹配多个标签的行(这里我使用 AND,使用 OR 也不起作用,因为它返回的任何行匹配任何搜索词。此结果太宽泛,我希望匹配所有搜索词)。它应该返回多行,每行有一个标签,我想搜索每一行。我只想返回由用户指定的一些标签标记的对象,但我不知道如何形成所述查询。有什么帮助吗?

4

1 回答 1

1

你有两个objects_tags要求,所以你需要两个objects_tags连接。

SELECT objects.Object
FROM objects
JOIN objects_tags ot1 ON (objects.Object = ot1.Object AND ot1.Tag = 'Tag1')
JOIN objects_tags ot2 ON (objects.Object = ot2.Object AND ot2.Tag = 'Tag2')
于 2013-04-03T22:48:41.193 回答