我正在为我的作业编写一些博客软件,我有一个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_title
和posts
。基本上,如果我给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'
谢谢!
答案 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 = ?