我有一个有文章的数据库。所有文章都有关键词。关键字位于单独的表中,关键字和项目与关系表相连接,因此:
文章
CREATE TABLE `articles` (
`id` int(11) NOT NULL,
`articleTitle` varchar(50) NOT NULL,
`articleBody` text NOT NULL,
`articlePermalink` varchar(50) NOT NULL,
`articleAuthor` int(11) NOT NULL,
`createdAt` datetime DEFAULT CURRENT_TIMESTAMP,
`updatedAt` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
关键词
CREATE TABLE `keywords` (
`id` int(11) NOT NULL,
`keyword` varchar(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
articlekeywords
CREATE TABLE `articlekeywords` (
`id` int(11) NOT NULL,
`articleId` int(11) NOT NULL,
`keywordId` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我希望使用articles.id作为标识符,选择与任何给定文章具有部分或全部关键字的所有文章。最好有一个单一的SQL调用。
编辑:
最后,我做了一些非常类似于Gordon Linoff suggested below的事情。
SELECT DISTINCT a.articleTitle, a.articlePermalink
FROM articles a
JOIN articlekeywords ak ON a.id = ak.articleId
JOIN articlekeywords ak2 ON ak.keywordId = ak2.keywordId AND ak2.articleId = $articleId AND not(a.id = $articleId)
发布于 2016-12-25 19:07:59
这是一个自我连接。您可以通过以下操作获得匹配的文章,这些文章按共同关键字的数量排序:
select ak2.article2, count(*) as numKeywordsInCommon
from articlekeywords ak join
articlekeywords ak2
on ak.keywordid = ak2.keywordid and ak2.articleid = $arcticleid
group by ak2.articleid
order by numKeywordsInCommon desc;
发布于 2016-12-25 19:10:20
这将为您提供一个完整的列表,该列表由文章关键字表中的关系标识:
SELECT * FROM articlekeywords AKW
JOIN articles A ON AKW.articleId = A.Id
JOIN keywords K ON AKW.keywordId = K.Id
-- WHERE (some condition you'd like to do for further filtering)
https://stackoverflow.com/questions/41323786
复制相似问题