我有一个包含3个表的数据库
带有字段的文章:id:int name:varchar(255)text:text
带有字段的标签:id:int name:varchar(255))
article_tag,包含字段:id:int article_id:int(foreign key => article.id)tag_id:int(foreign key => tag.id)
我希望能够找到与多个标签相关的文章。
如果我这样做:
SELECT article.name FROM article
JOIN article_tag ON article.id = article_tag.article_id
JOIN tag ON tag.id = article_tag.tag_id
WHERE tag.name IN ('science', 'technology', ... );
我收到每篇文章*(它拥有的标签数量);这是预料之中的。
我的问题:是否有一种方法可以对其进行优化,使其按照article.id的频率降序列出(效果是匹配的列表越多,列表中的列表越高)或者说是仅返回与所有标记匹配的记录(结果中出现次数=标记数)。
谢谢,对不起,这个问题没有更好的格式化
答案 0 :(得分:0)
获取重复文章的计数并订购它们
SELECT article.name ,COUNT( article.name) AS acount FROM article
JOIN article_tag ON article.id = article_tag.article_id
JOIN tag ON tag.id = article_tag.tag_id
WHERE tag.name IN ('science', 'technology', ... )
GROUP BY article.name
ORDER BY acount DESC
答案 1 :(得分:0)
如果我正确理解了这个问题,这应该可以解决问题:
SELECT
article.id,
article.name,
COUNT(*) AS TagCount
FROM article
JOIN article_tag ON article.id = article_tag.article_id
JOIN tag ON tag.id = article_tag.tag_id
WHERE tag.name IN ('science', 'technology', ... )
GROUP BY
article.id,
article.name
ORDER BY
TagCount DESC