MYSQL學習:GROUP BY分組取最新的一條記錄

? ? ? ? ? ? ? ?

日常開發當中,經常會遇到查詢分組數據中最新的一條記錄,比如統計當前系統每個人的最新登錄記錄、外賣系統統計所有買家最新的一次訂單記錄、圖書管理系統借閱者最新借閱書籍的記錄等等。今天給大家介紹一下如何實現以上場景的SQL寫法,希望對大家能有所幫助!

1、初始化數據表

-- 借閱者表
CREATE TABLE `userinfo` (`uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',`uname` varchar(20) NOT NULL COMMENT '姓名',`uage` int(11) NOT NULL COMMENT '年齡',PRIMARY KEY (`uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
INSERT INTO `userinfo` VALUES (1, '小明', 20);
INSERT INTO `userinfo` VALUES (2, '小張', 30);
INSERT INTO `userinfo` VALUES (3, '小李', 28);
-- 書籍表
CREATE TABLE `bookinfo` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',`book_no` varchar(20) NOT NULL COMMENT '書籍編號',`book_name` varchar(20) NOT NULL COMMENT '書籍名稱',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
INSERT INTO `bookinfo` VALUES (1, 'ISBN001', '計算機基礎');
INSERT INTO `bookinfo` VALUES (2, 'ISBN002', '計算機網絡');
INSERT INTO `bookinfo` VALUES (3, 'ISBN003', '高等數學');
INSERT INTO `bookinfo` VALUES (4, 'ISBN004', '明朝那些事');
INSERT INTO `bookinfo` VALUES (5, 'ISBN005', '物理');
INSERT INTO `bookinfo` VALUES (13, 'ISBN006', '讀者');
-- 借閱記錄表
CREATE TABLE `borrow_record` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',`user_id` int(11) NOT NULL COMMENT '用戶id',`book_id` int(11) NOT NULL COMMENT '書籍id',`borrowtime` datetime NOT NULL COMMENT '書籍id',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
INSERT INTO `borrow_record` VALUES (8, 1, 2, '2021-05-01 10:52:00');
INSERT INTO `borrow_record` VALUES (9, 2, 4, '2021-07-12 23:32:00');
INSERT INTO `borrow_record` VALUES (10, 2, 1, '2021-03-21 09:00:00');
INSERT INTO `borrow_record` VALUES (11, 1, 3, '2021-08-11 17:39:00');
INSERT INTO `borrow_record` VALUES (12, 1, 5, '2021-09-02 18:12:00');
INSERT INTO `borrow_record` VALUES (13, 3, 1, '2021-07-06 12:32:00');
INSERT INTO `borrow_record` VALUES (14, 2, 1, '2021-08-09 10:10:00');
INSERT INTO `borrow_record` VALUES (15, 4, 3, '2021-04-15 19:45:00'
);

寫法1 直接group by 根據userid ,使用聚合函數max取得最近的瀏覽時間

select a.user_id ,max(c.uname) uname
,max(a.borrowtime) borrowtime,max(b.book_name) book_name
from borrow_record a 
INNER JOIN bookinfo b on b.id=a.book_id
INNER JOIN userinfo c on c.uid=a.user_id
GROUP BY a.user_id
--?說明:?這樣會存在獲取書籍名稱錯亂的情況,
-- 因為使用聚合函數獲取的書籍名稱,不一定是對應用戶
-- 最新瀏覽記錄對應的書籍名稱

寫法2 采用子查詢的方式,獲取借閱記錄表最近的瀏覽時間作為查詢條件

select a.user_id ,c.uname,a.borrowtime 
,b.book_name book_namefrom borrow_record a 
INNER JOIN bookinfo b on b.id=a.book_id
INNER JOIN userinfo c on c.uid=a.user_id
where a.borrowtime=(select max(borrowtime) 
from borrow_record t where t.user_id=a.user_id)
-- 說明:可以滿足查詢效果,不過性能不是最優解

寫法3 采用group by + join 性能最高,推薦采用

select a.user_id ,c.uname,a.borrowtime 
,b.book_name book_namefrom (
select t.user_id,max(borrowtime)  borrowtime
from borrow_record t GROUP BY t.user_id) as e INNER JOIN  borrow_record a on e.user_id=a.user_id 
and e.borrowtime=a.borrowtimeINNER 
JOIN bookinfo b on b.id=a.book_id
INNER JOIN userinfo c on c.uid=a.user_id

運行效果如下:

? ? ? ? ? ? ? ?

IT技術分享社區

個人博客網站:https://programmerblog.xyz

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/270478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/270478.shtml
英文地址,請注明出處:http://en.pswp.cn/news/270478.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

@SentinelResource注解實現熱點限流

下圖中請求url中param參數為axb,如果QPS超過5,就會限流 一:如下代碼 RestController public class ParamController {GetMapping("/param")SentinelResource(value "param", blockHandler "exHandler")p…

[LeetCode] 4Sum II 四數之和之二

Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] B[j] C[k] D[l] is zero. To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of…

php的正則表達式函數,php中常用的正則表達式函數

php中常用的正則表達式函數* preg_match()* preg_match_all()* preg_replace()* preg_filter()* preg_grep()* preg_split()* preg_quote()接下來對比講解:講解中 $pattern 通常表示正則表達式$subject 通常表示目標處理數據定義一個方法 方便查看數據類型&#xff…

硬件知識:固態硬盤4K對齊知識介紹

目錄 1、什么是4K對齊呢? 2、怎么查看硬盤是否4K對齊呢? 3、怎么4K對齊呢? 現在大家基本都有一個固態硬盤,而在固態硬盤分區中4K對齊是非常重要的。 1、什么是4K對齊呢? “4K對齊”就是符合“4K扇區”定義格式化過的硬…

【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的區別

SpringCloudApplication注解 注解SpringCloudApplication包括:SpringBootApplication、EnableDiscoveryClient、EnableCircuitBreaker,分別是SpringBoot注解、注冊服務中心Eureka注解、斷路器注解。對于SpringCloud來說,這是每一微服務必須應…

網絡知識:路由器常見故障分析及處理方法

目錄 1.路由器的部分功能無法實現 2.網絡頻繁掉線 3.無法瀏覽網頁 4.某些應用無法使用 5.網絡帶寬達不到合同帶寬或相差甚遠 6.局域網內存在多個路由器,因人為原因出現二級路由 對當前的大多數網絡來說,無論是實現網絡互連還是訪問Internet&a…

matlab找不到函數系統函數,求助,Matlab找不到ztrans函數

只把這個函數給你吧,你自己保存下:function F ztrans(varargin)%ZTRANS Z-transform.% F ZTRANS(f) is the Z-transform of the scalar sym f with default% independent variable n. The default return is a function of z:% f f(n) > F F(z). The Z-transfor…

硬件技巧:如何隱設置的你的電腦U盤不可見

有時候電腦里面有重要內容,在不聯網的情況下,還需要禁用U盤,下面介紹禁用U盤的方法,原創文章,轉載注明出處即可。 第一步,首先在電腦上點擊開始按鈕,或者直接按下快捷鍵組合"WinR"&am…

XidianOJ 1035 數獨 1053 正數負數 1042 另一個簡單的游戲

三道水題。。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n; int main(){while (scanf("%d",&n) ! EOF){if (n > 0){printf("yes\n");}else if (n < 0)…

Django 基本命令

1. 新建一個 django projectdjango-admin.py startproject project-name一個 project 為一個項目&#xff0c;project-name 項目名稱&#xff0c;改成你自己的&#xff0c;要符合Python 的變量命名規則&#xff08;以下劃線或字母開頭&#xff09;2. 新建 apppython manage.py …

前端知識:如何創建自己的Iconfont圖標庫

在日常的開發過程中&#xff0c;前端頁面經常會引用一些圖標&#xff0c;iconfont圖標庫是前端開發者非常友好的在線字體圖標庫。大家可以根據平常所涉及的項目&#xff0c;收藏自己需要的圖標庫&#xff0c;方便在后續的項目中使用&#xff0c;今天小編給大家介紹如何通過icon…

mysql 二次 聚合,MySql-聚合查詢

聚合查詢Chloe 可以像寫 sql 一樣實現聚合查詢。IQuery q context.Query();q.Select(a > Sql.Count()).First();/** SELECT COUNT(1) AS C FROM Users AS Users LIMIT 0,1*//* 支持多個聚合函數 */q.Select(a > new{Count Sql.Count(),LongCount Sql.LongCount(),Sum …

硬件:固態硬盤SSD的基礎知識及安裝注意事項

固態硬盤就是用固態電子存儲芯片陣列而制成的硬盤&#xff0c;相對于機械硬盤&#xff0c;固態硬盤的讀寫速度更快&#xff0c;但是固態硬盤的缺點是壽命不如機械硬盤。 固態硬盤有寫入壽命&#xff0c;平均起來約為3000次P/E&#xff0c;1P/E為硬盤存儲上限&#xff0c;相當于…

C# Redis實戰(二)

二、Redis服務 在C# Redis實戰(一)中我將所有文件拷貝到了D盤redis文件夾下&#xff0c;其中redis-server.exe即為其服務端程序&#xff0c;雙擊即開始運行&#xff0c;如圖可以將此服務設置為windows系統服務&#xff0c;下載Redis服務安裝軟件&#xff0c;安裝即可。安裝完成…

matlab仿真超聲波測距,超聲波測距儀制作-Arduino中文社區 - Powered by Discuz!

本帖最后由 xiebb5688 于 2017-12-4 09:06 編輯雖然學的是機械&#xff0c;可也接觸過C語言&#xff0c;MATLAB等程序&#xff0c;每次編程的時候&#xff0c;能夠把BUG一個個解決掉&#xff0c;會帶來不小的成就感。于是感覺到自己骨子還是挺喜歡代碼的。于是也不知何時了解了…

Mac版本Navicat下載

提供navicat安裝包 鏈接&#xff1a;https://pan.baidu.com/s/1mQddUOuaxovVkhNOT9vUJw 密碼&#xff1a;tted

電腦技巧:鍵盤上的這幾個鍵,不常用,但有必要了解一下

目錄 鍵盤上三個特殊的鍵 Print Screen&#xff08;或 Prt Scn&#xff09; Scroll Lock&#xff08;或 Scr Lk&#xff09; Pause/Break ??????? 鍵盤上三個特殊的鍵 通過前幾期的文章&#xff0c;我們已經討論了幾乎所有可能要用到的鍵。但為了真正徹底地了解鍵盤&…

ip訪問php $_files空,PHP中表單沒有問題但$_FILES為空怎么辦?

PHP中表單沒有問題&#xff0c;但“$_FILES”為空的解決方法&#xff1a;首先在form中加代碼為“enctype"multipart/form-data”&#xff1b;然后開啟“file_uploads”并設置“file_uploadson”即可。PHP中表單沒有問題但是$_FILES為空的解決辦法在文件上傳中$_FILES接收不…