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)

これは 1 つの 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 に答える