1

これは、SOに関する私の最初の質問です。したがって、次の列を持つ posts という名前の MYSQL テーブルがあります。

投稿、タグ 1、タグ 2。

テーブルに合計 10 行あるとします。投稿のうち 9 つは tag1 のみにタグがあり、10 番目の投稿には tag1 と tag2 にタグがあります (tag2 のタグは他の投稿の tag1 に複製されています)。テーブルは次のようになります。

  Tag1                Tag2
computer               -
tv                     -
computer               -
tv                     -
laptop                 -
bicycle                -
stereo                 -
computer             laptop
tv                     -
laptop                 -

私が望む機能は、テーブルにクエリを実行して、出現頻度が最も高いタグを取得し、それらをグループ化し、頻度が最も高いものから順に並べることです。これが私のmysqlクエリです(私はPDOを使用しています):

SELECT count, tag 
FROM (SELECT count(tag1) as count, tag1 as tag FROM posts) as a 
UNION ALL 
SELECT count(tag2) as count, tag2 as tag 
FROM posts

存在する各タグが表示されないため、このクエリは機能しません。また、列 tag2 の 1 つのタグを tag1 の結果に追加しているようには見えず、代わりに重複があります。そのため、ラップトップが 3 回表示されるのではなく、ラップトップが 2 回表示されてから 1 回表示されます。

これは GROUP BY によって解決されると考えましたが、GROUP BY mysql を追加しようとすると、データベース サーバーのドキュメントを参照するようにという一般的な構文エラーがスローされます。したがって、GROUP BY をどこに置くべきかわからないと思います。また、クエリがまったく正しくないと考えている可能性があります。利用可能なヘルプをお願いします....ユニオンでグループを使用することに関する他の多くの質問を調べましたが、答えが見つからないか、答えが見えたときに知るのに十分な理解がありません。

4

2 に答える 2

4

私はあなたがこのようなことを意味していると思います(sqlfiddle):

SELECT COUNT(*), tag
FROM
(
    SELECT Tag1 AS tag
    FROM posts
    UNION ALL
    SELECT Tag2 AS tag
    FROM posts
) AS alltags
GROUP BY tag
于 2012-08-12T08:19:41.103 に答える
1

試す:

SELECT tag, count(*) AS frequency
FROM
(
  SELECT tag1 AS tag FROM posts
  UNION ALL SELECT tag2 AS tag FROM posts
) AS alltags
WHERE tag IS NOT NULL
GROUP BY tag
ORDER BY frequency DESC

UNION は暗黙の識別を実行するため、UNION ALL が必要であることに注意してください。

于 2012-08-12T08:29:08.403 に答える