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