实际上,我已经创建了一个CMS,可以在其中插入带有关键字的帖子。我的意思是,我使用的是mysql数据库中的一个表,其中有一个名为"keywords"的列。
我想使用逗号分隔的关键字创建类别,要做到这一点,我必须一次提取一个单词。如果某个帖子有很多单词,我想知道使用PHP必须使用的sql查询(或PHP代码)。
例如:-如果我有如下所示的表格,
Post_id Post_title Post_keywords1第一次发布PHP2秒后PHP,jquery3第三帖css,html4第四个帖子html
我想根据如下所示的关键字创建类别:-
PHP->第一篇Jquery->第二篇CSS->第三篇第二个岗位html->第三篇文章第四个岗位
意味着我点击php,它应该包含两个帖子"第一个帖子"answers"第二个帖子"。
您的帖子表:
CREATE TABLE posts
(`id` int, `title` varchar(11))
;
INSERT INTO posts
(`id`, `title`)
VALUES
(1, 'first post'),
(2, 'second post'),
(3, 'third post'),
(4, 'fourth post')
;
您的标签表
CREATE TABLE tags
(`id` int, `tag` varchar(6))
;
INSERT INTO tags
(`id`, `tag`)
VALUES
(1, 'PHP'),
(2, 'jquery'),
(3, 'css'),
(4, 'html')
;
还有你的加入表。
CREATE TABLE post2tags
(`postid` int, `tagid` int)
;
INSERT INTO post2tags
(`postid`, `tagid`)
VALUES
(1, 1),
(2, 1),
(2, 2),
(3, 3),
(3, 4),
(4, 4)
;
然后这个SQL基本上得到了你想要的(也许理论不同):
SELECT t.*, p.*
FROM tags t
INNER JOIN post2tags p2t ON t.id=p2t.tagid
INNER JOIN posts p ON p.id=p2t.postid
ORDER BY t.tag, p.title
这是一个SQLFiddle
这是一种多对多的关系。一旦你理解了它,你可能会经常使用它。
我会执行以下
后的表格
PostId|PostName|...
1|First Post|...
2|Second Post|...
...
表关键字
keyID|KeyName
1|PHP
2|JQUERY
...
表RE_Post_KEY(多对多)
PostID|KeyID
1|1
1|2
2|1
2|2
...
虽然我同意规范化数据库的建议,但为了回答您的具体问题,您可以使用FIND_IN_SET()
:
SELECT Post_Title
FROM YourTable
WHERE FIND_IN_SET('php', post_keywords)
- SQL Fiddle演示
但是,如果规范化数据库,则只需要使用一个简单的JOIN
。