這是前天看見的乙個面試題。
在這裡有兩個表,乙個使用者表和乙個使用者積分記錄表。
找到總積分前10的使用者和使用者資訊
使用者表和積分記錄表,唯一的聯絡就是會員uid。
使用者表
積分記錄表
結果
這裡用到了sum()
求和函式和group
分組。
需求是求前10的,這裡資料量沒那麼大就求前5把,既然是前5,我們就降序排列。這裡就要使用mysql排序了。
使用 order by 子句將查詢資料排序後再返回;
asc:公升序(預設)
desc :降序。
根據總積分排序,那麼我需要使用求和後的總積分了。
這裡總積分有了,排序也有了。剩下的是找到總積分排序中的前5個。
需要使用mysql的limit了。
limit子句接受乙個或兩個引數。兩個引數的值必須為零或正整數。
offset:引數指定要返回的第一行的偏移量。第一行的偏移量為0,而不是1。
count:指定要返回的最大行數。
但是limit 0,count
和limit count
是一樣的結果,取表中的前count行。
這裡我們就取到了積分表中總積分前5的了,但是還不知道使用者資訊。
這裡我們希望是通過前面找到的總分前5的uid來找使用者資訊,然後把結果拼接在一起輸出。既然是兩個表的結果拼接就需要left join
。那麼sql語句就是這樣的了:
這裡其實我們已經找到了總分前5的人的資訊了。但是結果似乎有點問題。
這裡我們先看看上面的sql語句的邏輯:
1.根據使用者uid求使用者總積分;
2.根據總積分按照降序排列;
3.取上面獲得的資料中的前5個;
4.根據上面的結果去使用者表查詢,結果做鏈結在一起輸出。
這個過程似乎沒任何問題,但是實際的查詢結果卻輸出了下面那些null
我們不需要的資料。但是這裡為什麼?我也不知道原因。
解決問題就只能換個思路了。
先對使用者積分表排序排序,然後找根據這個結果去使用者表找,最後的結果在輸出前5條。
這樣就好了。
// 修改字段型別
alter
table usertb modify column uid(欄位名) text(字段型別);
// 修改欄位名
alter table scoretb change name(原欄位名)
score(目標欄位名)
text(字段型別);
分組查詢各省份的前十條記錄
select from select mu.row number over partition by mu.prov code order by mu.prov code rn from mvno user mu where rn 2 在使用 row number over 函式時候,over 裡頭...
mysql查詢優化 未優化前的效果
兩個表,test和test2 test中100萬條資料,欄位有id,networkid等 test2中有1200萬資料,欄位有testid,code等。主鍵為bigint,沒有索引 1 分開查詢 語句 select id from test2 where code def7414551 耗時 15....
mysql指令碼查詢使用者 顯示Mysql中的所有使用者
在mysql中如何顯示所有使用者?1 show databases顯示所有資料庫 2 show tables顯示所有資料表 3 select current user 顯示當前使用者 4 顯示所有使用者 1.登入資料庫 首先,你需要使用如下命令登入到資料庫,注意,必須是root使用者哦 mysql ...