MySQL查询连接,每个结果条件的位置

时间:2013-04-03 22:44:43

标签: mysql join

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

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

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

数据无关紧要。标签看起来基本相同,如:

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

我的'crosstable'看起来像

  +--------+----------------------------------------+
  | 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不起作用,因为它返回任何行,匹配任何搜索字词。此结果太宽泛,我希望所有搜索字词匹配)。它应该返回多行,每行一个标记,我想要搜索每个标记。我只想返回由用户指定的一些标签标记的对象,但我不知道如何形成所述查询。有什么帮助吗?

1 个答案:

答案 0 :(得分: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')