我的情况是:
我有3个表格,结构如下:
articles: article_id, more data;
tags: tag_id, tag_name, more data;
article_tags: article_tag_id, tag_id, article_id
每篇文章都可以有多个标签。我想检索按标签使用次数排序的文章标签(提供了article_id)。
例如:
Article1 has tags 'tag4', 'tag3', 'tag2'
Article2 has tags 'tag4', 'tag3'
Article3 has tags 'tag4'
Article4 has tags 'tag4', 'tag3', 'tag2', 'tag1'
所以当我在寻找article4的标签时,它应该这样命令:
1. tag4 (4 occurrences)
2. tag3 (3 occurrences)
3. tag2 (2 occurrences)
4. tag1 (1 occurrence)
这可能是一个MySql查询吗? 目前我只是检索该文章的所有标签,然后是另一个数组,其中包含按出现次数排序的标签列表,然后只使用后者手动排序前一个数组。
答案 0 :(得分:2)
在这种情况下我更喜欢使用LEFT JOIN
,因为标签可能未使用。
SELECT a.tag_name
FROM tags a
LEFT JOIN article_tags b
ON a.tag_id = b.tag_id
GROUP BY a.tag_name
ORDER BY COUNT(b.tag_id) DESC
要进一步了解联接,请访问以下链接:
答案 1 :(得分:1)
我认为那是
SELECT t.tag_name, COUNT(at.*) as total
FROM tags t
JOIN article_tags at ON at.tag_id=t.tag_id
WHERE t.tag_id IN (SELECT tag_id FROM article_tags at2 WHERE at2.article_id = ?)
GROUP BY t.tag_name
ORDER BY total DESC
更新: 在where子句
中添加了文章ID答案 2 :(得分:0)
以下sql语句应该为您提供所需的结果。 将777替换为特定文章ID
select t.tag_name, count(at.article_tag_id) as [cnt]
from article_tags at
join tags t on (t.tag_id = at.tag_id)
join articles a on (a.article_id = at.article_id)
where a.article_id = 777
group by tag_name
order by cnt desc