1

ここから多くの解決策を試しましたが、どれも私の問題を解決しませんでした! 次のテーブル構造があります。

|Column|Type|
|------
|activity_id| int(10) PRIMARY
|user_id| int(10)
|type| varchar(255)
|activity| varchar(255)
|item_id| int(11)
|secundary_id| int(11)
|date| datetime

アクティビティ ストリームを作成しています。このテーブルに次のように記録します。

「John (user_id) が 5 時間前 (date) に投稿 (type => item_id) に (アクティビティ) コメントしました」

私は次の構造を行うつもりです:

「John、Marie、+2 が 5 時間前の投稿にコメントしました」

これまでのところ、この接続はできましたが、レコードを日付順に並べることができません。独自のテーブルでいくつかの内部結合を試みましたが、(type,activity,item_id) でグループ化されていない他のアクティビティ タイプを取得できませんでした。次に例を示します。

「ジョン ( user_id ) が (アクティビティ) を投稿しました (type => item_id ) 5 時間前 (date)」

JOINS を使用すると、グループ化されたレコードのみが取得されます。これは私の実際のクエリです:

SELECT t.*, GROUP_CONCAT(DISTINCT user_id ) AS users FROM (
SELECT *
FROM activity
   ORDER BY date DESC 
)t
GROUP BY type, activity, item_id
ORDER BY date DESC

私はすでにここにリストされているいくつかの解決策を試しました.1つの列の値が異なる3つの最新のレコードを選択します しかし、テーブルを結合すると、グループ化されていないレコードが失われました! 別の考えを持っている人はいますか?今までありがとう!

/** 編集 - 結果

activity_id     user_id     type    activity    item_id     secundary_id    date    users
865         32  update  comment     20  22  2013-10-29 15:03:49     32,34
858         36  update  post    20  NULL    2013-10-29 13:50:59     36
864         32  post    comment     2615    21  2013-10-29 14:55:58     32,34,36
856         36  post    comment     2616    14  2013-10-29 13:50:10     36,39,34,32
872         32  post    comment     2617    28  2013-10-29 15:46:20     32
852         34  post    post    2615    NULL    2013-10-29 13:47:25     34
854         32  post    post    2616    NULL    2013-10-29 13:49:13     32
870         32  post    post    2617    NULL    2013-10-29 15:36:57     32

それは上記のクエリで取得したものですが、たとえば、4 つのユーザー コメントがある item_id 2616 は、最後のユーザー コメントの日付で並べ替えられていません。たとえば、次のレコードがあります。

activity_id user_id type activity item_id secundary_item date
856     36  post    comentar    2616    14  2013-10-29 14:05:10

彼の日付は14:05ですが、私の選択では、別の古いコメント日付が表示されます!

-- フィドル

http://sqlfiddle.com/#!2/1923d2/1


@トムによって解決

4

1 に答える 1

3

最新の日付を取得したい場合は、これを試してください:

オリジナル

SELECT   activity_id, user_id, type, activity, item_id, secundary_id, MAX(date) date, 
         GROUP_CONCAT(DISTINCT user_id ) AS users 
FROM     activity
GROUP BY type, activity, item_id
ORDER BY date DESC

編集済み- 以下は、各グループの最新のレコードを示します。

SELECT   activity_id, user_id, type, activity, item_id, secundary_id, date, 
         users

FROM     activity a

         JOIN ( SELECT   MAX(activity_id) max_activity_id,
                         GROUP_CONCAT(DISTINCT user_id ) AS users
                FROM     activity
                GROUP BY type, activity, item_id
              ) AS grp ON a.activity_id = grp.max_activity_id

GROUP BY date DESC
于 2013-10-29T18:34:58.473 に答える