2016-03-29 18 views
1

注:私はこの質問に対して最も正しい主題を与えているかどうかは分かりませんが、これに対する正しいアプローチについてはわかりませんが、どこからでも他の例は見つかりませんでした。非常に特定のクエリです。SQL - GROUP BYの最大値

だから、私は(投票レコード「upvote」別のテーブルに記事をreleventに対応(一意user_idは列の番号として識別)は、ユーザーが作成した投票で満たされているテーブルの「票」を、持っていますそれぞれの関連する投稿はユーザインターフェース内にある)。私は、最新の投票のためにこれらの票(日時によって)をソートするつもり

は、それぞれのを作成しを投稿(列をpost_idの)、そのように、回避の重複は、各post_idのの値を返していました。

I入力、次のクエリ:

SELECT id, user_id, post_id, created, MAX(created) 
FROM votes 
GROUP BY post_id, user_id 
ORDER BY max(created) DESC 

そして返されます:あなたが見ることができるように

Table: votes 

id | user_id | post_id |  created  | MAX(created) 
----+-----------+-----------+-----------------------+-------------------- 
115 | 1   | 42  | 2014-07-03 23:08:31 | 2016-03-07 12:08:31 
----+-----------+-----------+-----------------------+--------------------   
237 | 2   | 101  | 2014-02-13 23:05:14 | 2016-03-05 23:05:14   
----+-----------+-----------+-----------------------+-------------------- 
431 | 7   | 944  | 2014-10-22 22:58:37 | 2016-03-03 19:58:37 
----+-----------+-----------+-----------------------+-------------------- 
255 | 15  | 101  | 2014-02-15 14:02:01 | 2016-02-01 23:05:14 
----+-----------+-----------+-----------------------+-------------------- 
... | ...  | ...  | ...     | ... 

の重複が "101"をpost_idのがあります。このクエリの結果は、それぞれuser_idの最大作成時間でソートされ、重複して表示されます。post_idpost_id列の行が「101」の場合、post_id列の値「101」が最大作成時間(MAX(が作成された))のみを表示したい場合。

私はでわずかグループは、それが(最大を返しませんので、私はMAX(を作成した)でソートすることができませんでしだをpost_idの場合列は、一見、一緒に他のグループ化する必要がありとUSER_IDをpost_idのを作成してください)。

これらを削除するにはどうすればいいですかpost_id最大作成時間を返さない値はありますか?私は後だ何

Table: votes 

id | user_id | post_id |  created  | MAX(created) 
----+-----------+-----------+-----------------------+-------------------- 
115 | 1   | 42  | 2014-07-03 23:08:31 | 2016-03-07 12:08:31 
----+-----------+-----------+-----------------------+--------------------   
237 | 2   | 101  | 2014-02-13 23:05:14 | 2016-03-05 23:05:14   
----+-----------+-----------+-----------------------+-------------------- 
431 | 7   | 944  | 2014-10-22 22:58:37 | 2016-03-03 19:58:37 
----+-----------+-----------+-----------------------+-------------------- 
... | ...  | ...  | ...     | ... 
+0

user_IDでグループ化しないでください。 max(作成)の後にいるだけで、同じPost_IDに結びついている限り、そのmax(作成された)データに対して返されるuser_IDは何も気にしないでください。user_IDでグループ化しないでください。 – xQbert

+0

私はちょうどpost_idでグループ化していますが、最後のpost_idのuser_idに関連する各post_idの最大値(作成された)を返さないため、MAX(作成済み)で並べ替えることができません – user1228907

答えて

1

あなただけの各ポストの最後の投票をしたいと仮定:

SELECT v.* 
FROM posts p 
JOIN votes v 
ON  v.id = 
     (
     SELECT id 
     FROM votes vi 
     WHERE post_id = p.id 
     ORDER BY 
       created DESC 
     LIMIT 1 
     ) 
+0

"votes vi"とは? – user1228907

+0

また、これは各投票のMAX(作成済み)を返さず、v.post_id = p.id – user1228907

+0

という複数のケースがあることを見落としています。実際にはこれがうまくいくと思います... – user1228907

0

あなたがpost_idを最後に編集user_idを取得するために探している場合は、group by post_idを試してみて、時間の降順で並べ替えます(自動インクリメントの場合はid)。あなたが(user_id,time)の履歴が必要な場合はmyhistory列のコードで述べたように

SELECT tbl.* , GROUP_CONCAT('(',tbl.user_id,',',tbl.created,')') as myhistory FROM 
    (SELECT id, user_id, post_id, created, MAX(created) 
    FROM votes 
    ORDER BY max(created) DESC 
    ) as tbl 
GROUP BY tbl.post_id 

あなたはgroup_concat機能を使用することができます。