0

我的情况是这样的:

我有 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 查询实现吗?目前我只是检索该文章的所有标签,然后是另一个数组,其中包含按出现次数排序的标签列表,然后只是使用后者手动对前一个数组进行排序。

4

3 回答 3

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

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-05-02T14:02:10.247 回答
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

于 2013-05-02T14:13:10.353 回答
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
于 2013-05-02T14:05:15.077 回答