从具有关系的表中检索post标签

时间:2012-02-04 22:51:30

标签: php mysql sql database-schema

我正在为我的作业编写一些博客软件,我有一个posts表,tags表和post_tags。存在post_tags以删除多对多关系(一个帖子可能包含许多标签,一个标签可能属于许多帖子)。这是这些表的字段:

帖子

| p_id | title | clean_title | body | published | u_id |

标签

| t_id | name | slug |

post_tags

 | t_id | p_id |

希望你能看到我在这里发生了什么,标签使用post_tags表链接到帖子。现在,我想根据name表的slug字段从tags表中检索clean_titleposts。基本上,如果我给clean_name,我想要所有与该帖子相关联的标签。我知道我必须使用SQL JOINS,但我不知道如何使用它们。

这是我尝试过的:

$query = $this->db->query("SELECT name, slug
                           FROM tags
                           LEFT JOIN post_tags ON posts.p_id=post_tags.p_id
                           LEFT JOIN tags ON post_tags.t_id=tags.t_id
                           WHERE posts.clean_title = ?
                           ORDER BY name DESC");

但是我收到了这个错误:Not unique table/alias: 'tags'

谢谢!

2 个答案:

答案 0 :(得分:2)

您的第一个JOIN引用posts,但您不在其他地方使用该表。我怀疑你的意思是:

     SELECT name, slug
     /* First table should have been `posts`? */
     FROM posts
     LEFT JOIN post_tags ON posts.p_id=post_tags.p_id
     LEFT JOIN tags ON post_tags.t_id=tags.t_id
     WHERE posts.clean_title = ?
     ORDER BY name DESC

答案 1 :(得分:0)

您要加入tags两次。更改第二个join以加入帖子表:

SELECT tags.name, tags.slug
FROM tags
LEFT JOIN post_tags ON post_tags.t_id = tags.t_id
LEFT JOIN posts ON posts.p_id = post_tags.p_id
WHERE posts.clean_title = ?

您可以使用以下别名缩短查询:

SELECT t.name, t.slug
FROM tags t
LEFT JOIN post_tags pt ON pt.t_id = t.t_id
LEFT JOIN posts p ON p.p_id = pt.p_id
WHERE p.clean_title = ?