0

2 つのテーブルがあります。1 つは「メッセージ テーブル」と呼ばれるテキスト、トピック、ユーザーの列を持ち、もう 1 つのテーブルは「トピック テーブル」と呼ばれるトピック、タイトルの列を持ちます。

例:

メッセージ表

Text        Topic    User
Hi          Ball     Hank
Hello       Foot     John
Sup         Ball     Hank
Nuthin'     Foot     Hank
No          Volley   Hank

トピックテーブル

Topic     Title
Ball      Basketball
Foot      Football
Volley    Volleyball

ユーザーのお気に入りのトピックのトップ 3 をトピックのタイトルで表示したいと考えています。

結果: Hank の上位 3 つのトピック

Topic Count     Topic      Title
2               Ball       Basketball
1               Foot       Football
1               Volley     Volleyball

特定のユーザーが「メッセージ テーブル」に持っている一意のトピックをカウントし、それを「トピック テーブル」に結合して、タイトルを取得し、結果をトピックの数で降順​​で並べ替える必要があります。ユーザーが最もよく使用するトピックを取得します。そして、上位3つを取得するために、結果を3行に制限します.

ヘルプ。

4

2 に答える 2

0

私はあなたの質問で、あなたはハンクを探していると思いますか?もしそうなら、これはとを使用して動作するはずCOUNTですGROUP BY

SELECT Count(m.Topic), t.topic, t.title
FROM messages m
   JOIN topic t on m.topic=t.topic
WHERE m.user = 'Hank'
GROUP BY t.topic

SQLフィドルデモ

- 編集 -

SELECT user, cnt, topic, title
FROM (
  SELECT 
    @rowNum:=IF(@prevUser=m.user,@rowNum+1,1) rn,
    @prevUser:=m.user,
    m.cnt, 
    t.topic, 
    t.title, 
    m.user
  FROM (SELECT Count(Topic) cnt, topic, user FROM messages GROUP BY user, topic ORDER BY user, Count(Topic) DESC) m
     JOIN topic t on m.topic=t.topic
     JOIN (SELECT @rowNum:= 0) t
  ) t
WHERE RN <= 3
ORDER BY User

SQLフィドルデモ

これにより、ユーザーごとに3つのレコードが返されます。1人のユーザーのみが必要な場合は、WHERE句に追加します。

于 2013-03-04T01:59:06.447 に答える
0

ハンクだけにTOP-3トピックが必要な場合は、

SELECT COUNT(m.Topic) `Count Topic`, m.Topic, MIN(t.Title) Title
  FROM messages m LEFT JOIN
       topics t ON m.Topic = t.Topic 
WHERE User = 'Hank'
GROUP BY m.Topic 
ORDER BY `Count Topic` DESC LIMIT 3

出力:

| COUNT TOPIC |  TOPIC |      TITLE |
-------------------------------------
|           2 |   Ball | Basketball |
|           1 |   Foot |   Football |
|           1 | Volley | Volleyball |

sqlfiddle

于 2013-03-04T02:03:37.267 に答える