1
SELECT t.tag_name
FROM tags t
 JOIN resource_tags rt ON rt.tag_id = t.tag_id
 JOIN resource r ON r.resource_id = rt.resource_id
 JOIN visitor_resource vr ON vr.resource_id = rt.resource_id
 JOIN visitor v ON v.visitor_id = vr.visitor_id
WHERE v.visitor_id = '1'
GROUP BY t.tag_name

ご覧のとおり、「visitor」は「resource」にアクセスし、それらの間の関係はvisitor_resourceに作成されます。

特定の「リソース」には、コンテンツに応じて2つの「タグ」があり、それらはresource_tagsのリレーションによって結合されます。

上記のクエリは、訪問者が訪問したすべてのリソースのタグ名を出力します。

ここで、タグが何回表されているかを調べたいと思います。

次のことを考慮してください。リソース1:tag1、tag2リソース2:tag1リソース3:tag2リソース4:tag1

クエリは次のように出力する必要があります:tag1、3 tag2、2

私は次のことを試しました:

SELECT t.tag_name, SUM(t.tag_id) as cnt
 FROM tags t
 JOIN resource_tags rt ON rt.tag_id = t.tag_id
 JOIN visitor_resource vr ON vr.resource_id = rt.resource_id
 JOIN visitor v ON v.visitor_id = vr.visitor_id
WHERE v.visitor_id = '2'
GROUP BY t.tag_name

しかし、それはcntの数が非常に不合理であり、この特定のユーザーを考慮していないようです。

これはMySQLでも可能ですか?

4

3 に答える 3

1

COUNTではなくIDに対してSUMを実行しています。

基本的に、タグの自動生成された値を合計します。これにより、単にオカレンスを合計するよりもはるかに高い結果が得られます。

于 2011-04-21T14:00:57.207 に答える
1

COUNTではなくSUMを実行しているために問題が発生している可能性があります

SELECT t.tag_name, COUNT(t.tag_id) as cnt

それ以外の

SELECT t.tag_name, SUM(t.tag_id) as cnt

それをする必要があります。

于 2011-04-21T14:02:25.117 に答える
0

使用する:COUNT(t.tag_id)

ではありませんSUM(t.tag_id)

また、ID(主キー)でグループ化するのがより一般的であり、インデックスをグループ化に使用できるため、おそらくより高速です。tag_nameにはインデックスがない場合があります。

SELECT t.tag_name
     , COUNT(t.tag_id) AS cnt
FROM tags t
  JOIN resource_tags rt ON rt.tag_id = t.tag_id
  JOIN visitor_resource vr ON vr.resource_id = rt.resource_id
  JOIN visitor v ON v.visitor_id = vr.visitor_id
WHERE v.visitor_id = '2'
GROUP BY t.tag_id
于 2011-04-21T14:00:29.890 に答える