[英]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_id和user_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.