如何选择多个标签

时间:2017-03-15 04:26:13

标签: php mysql

表1(个)

[pid - ptitle - pcontent - ptags]
[1 - PHPCourse - Lorem - PHP,MYSQL,PDO]

表2(标签)

[tag_id, tag_name]
[1      -      PHP]
[2     -     MYSQL]
[3      -      PDO]

将这两张表联系起来的最佳方法是什么? 我检查了3张桌子,我制作了第3张桌子

表3(posts_tags)

[pid  -  tag_id]
[1    -       1]
[1    -       2]
[1    -       3]

但人们说这对SELECT查询不好,即使我打算像这样使用它

SELECT * FROM tags WHERE id = $pid

但是我看到人们使用了一种叫做内连接的东西,甚至没有在代码中提到table3,而我无法理解它,那么我怎么能正确地做到这一点?

2 个答案:

答案 0 :(得分:0)

看看下面的代码。

表1(个)

[tag_id, tag_name]
[1      -      PHP]
[2     -     MYSQL]
[3      -      PDO]

表2(标签)

[pid  -  tag_id]
[1    -       1]
[1    -       2]
[1    -       3]

select * from posts 
inner join posts_tags at posts.pid = posts_tags.pid
inner join tags at tags.tag_id = post_tags.tag_id; 

表3(posts_tags)

{{1}}

答案 1 :(得分:0)

您的桌面设计方法看起来不错。 另外,wordpress和drupal正在使用类似的方法。 如果你想了解更多,请谷歌“wordpress分类法或drupal分类法”。 下载他们的源代码并分析数据库架构将对您有所帮助。

(不确定如何在不使用posts_tags的情况下获取数据...) 这是我的表架构和查询。

<强>帖子

id, title, content
1,  foo,   bar
2,  foo2,  bar2

<强>代码

id, name
1,  tag1
2,  tag2
3,  tag3
4,  tag4

<强> posts_tags

pid, tid
1,   1
1,   2
1,   3
2,   1
2,   2
2,   4

<强> QUERY

SELECT p.id, p.title, p.content, GROUP_CONCAT(t.name) as ptags 
FROM posts p
INNER JOIN posts_tags pt ON (p.id = pt.pid)
INNER JOIN tags t ON (t.id = pt.tid)
/* WHERE p.id = 1 */
GROUP BY p.id

<强> RESULT

id  title  content  ptags
1   foo    bar      tag1,tag2,tag3
2   foo2   bar2     tag1,tag2,tag4

当您分隔帖子和标签表时,您可以随时添加或删除标签功能,添加或删除标签,posts_tags。