ySql一對多,查詢最新數據
場景1:比如有一張學生信息表,還有一張日志表,每次修改了學生信息便會在日志表中插入一條更新日志,現在需要查詢出所有學生的最新的一條更新記錄
SELECT
log. *
FROM
`system_log` AS log
INNER JOIN `student` AS t ON log. student_id = t. student_id
INNER JOIN ( SELECT student_id, max( create_dae ) AS createDate FROM system_log GROUP BY student_id ) `maxTab` ON log. student_id = maxTab. student_id
AND `log`. create_dae = `maxTab`. createDate
WHERE
`log`. student_id IS NOT NULL
AND `log`. student_id != ''
AND t. student_id IS NOT NULL
AND t. student_id != ''
ORDER BY
`log`. create_dae DESC
LIMIT 100
-
- 先通過子查詢查詢出來 log表中 每個student對應的最大的創建時間,也就是最新的那一條日志記錄,是需要根據student_id進行分組查詢的,這樣子就可以查詢出來每一個學生的最新的日志記錄
- 2.通過 inner join 進行表關系關聯,log表和student表進行關聯,查詢出每一個學生對應的所有日志,在於子查詢出來的臨時表進行關聯,進而篩選出每一個學生對應的最新的一條日志記錄,最后進行倒序排列和分頁造作即可
場景二:如果這條sql查詢語句已經無法在進行優化的情況下,應該如何再進行效率的提高?
- 修改表結構,如果數據量不大的情況下,可以每次更新日志的時候將最新的一條日志結構同步更新到student表中即可
- 增加表,可以新增一張表專門用來存儲最新的日志記錄,每次插入日志表的時候,對該表進行同步更新
場景三:優化遇到瓶頸了,還有其他優化方案嗎?
- 引入Redis緩存:每次插入日志表的時候,向redis中增加最新記錄的環境以提高查詢效率