SQL - GROUP BY最大值

时间:2016-03-29 20:23:12

标签: mysql database group-by duplicates sql-order-by

注意:我不确定我是否将此问题作为最重要的标题,因为我不确定正确的方法,但我无法在任何地方找到其他示例因为它是一个非常具体的查询。

所以,我有一张表"投票",其中填写了由用户创建的投票(唯一标识为 user_id 列中的数字),对应于相关的帖子另一个表(投票记录" upvote"用户界面中的每个相关帖子)。

我打算按照为每个帖子( post_id 列)创建的最新投票顺序对这些投票(按日期时间)进行排序,因此,避免重复的返回值每个 post_id

我输入以下查询:

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
 ----+-----------+-----------+-----------------------+--------------------
 ... | ...       | ...       | ...                   | ...

如您所见, post_id " 101"有重复内容。此查询的结果似乎按每个 user_id 的最大创建时间排序,显示重复的 post_id ,例如当我只想显示" 101&#34的唯一 post_id 列值时,有两个 post_id 列行" 101" ;具有最大创建时间(MAX(已创建))。

post_id user_id 列似乎必须组合在一起,否则如果我只是按 post_id 进行分组我无法排序由MAX(创建),因为它不会为每个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
 ----+-----------+-----------+-----------------------+--------------------
 ... | ...       | ...       | ...                   | ...

3 个答案:

答案 0 :(得分: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
        )

答案 1 :(得分:0)

如果您正在寻找被user_id编辑post_id的最后group by post_id,请尝试id并按时间排序desc(或 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 ,如果它是自动增量)。

(user_id,time)

如果您需要group_concat的历史记录,可以使用myhistory列代码中提到的finishButton()功能。

答案 2 :(得分:0)

lstPrice

从组中获取最大值的另一种方法。该查询不需要汇总,就像“ GROUP BY”一样。

此外,当使用“ GROUP BY”分组时,每个组都按主键排序,这也需要很多时间。

我的查询将一个表的值与另一个表进行比较。直到他什么都找不到。如果找不到其他内容,则为最大值。

此查询可以帮助您节省时间,以从组中获取最大值。