簡體   English   中英

SQL - GROUP BY 最大值

[英]SQL - GROUP BY max value

注意:我不確定我是否給這個問題提供了最領先的標題,因為我不確定對此的正確方法,但我無法在任何地方找到其他示例,因為它是一個非常具體的查詢。

因此,我有一個“投票”表,其中包含用戶創建的投票(在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 ,例如有兩個post_id列行“101”,當我只想顯示“101”的唯一post_id列值時它具有最大創建時間(MAX(創建))。

post_iduser_id列似乎必須組合在一起,否則如果我只是按post_id分組,我將無法按 MAX( created ) 排序,因為它不會返回每個 post_id 的 max( created )。

如何刪除這些不返回最大創建時間的重復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
 ----+-----------+-----------+-----------------------+--------------------
 ... | ...       | ...       | ...                   | ...

假設您只想要每個帖子的最后一票:

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
        )

如果您正在尋找編輯post_id最后一個user_id ,請嘗試group by post_id並按時間 desc 排序(如果是自動遞增,則為id )。

 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)歷史記錄(user_id,time)您可以使用myhistory列的代碼中提到的group_concat函數。

SELECT maintable.*
FROM TABLE_NAME maintable
LEFT OUTER JOIN TABLE_NAME temporarytable
 ON maintable.GROUPING_BY_COLUMN = temporarytable.GROUPING_BY_COLUMN
 AND maintable.COLUMN_WHERE_THE_MAXIMUM_IS_NEEDED < temporarytable.COLUMN_WHERE_THE_MAXIMUM_IS_NEEDED
WHERE temporarytable.COLUMN_WHERE_THE_MAXIMUM_IS_NEEDED IS NULL
ORDER BY PRIMARY_KEY_COLUMN DESC
LIMIT 50;

從組中獲取最大值的另一種方法。 此查詢不需要聚合,就像“GROUP BY”一樣。

另外,在使用“GROUP BY”進行分組時,每個組都是按主鍵排序的,這也需要很多時間。

我的查詢將一個表的值與另一個表的值進行比較。 直到他再也找不到其他東西為止。 如果沒有發現其他任何東西,那么這是最大值。

此查詢可以幫助您節省從組中獲取最大值的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM