使用另一个表中的COUNT对该列进行SELECT和ORDER BY

时间:2013-05-02 13:59:07

标签: php mysql

我的情况是:

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

3 个答案:

答案 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