1. 程式人生 > >Learning mysql by leetcoe : No. 262 Trips and Users

Learning mysql by leetcoe : No. 262 Trips and Users

Leetcode mysql 262 Trips and Users

題目

goto: leetcode 262
難度: Hard

解答

SELECT Request_at AS Day, ROUND(COUNT(IF(Status != 'completed', TRUE, NULL)) /
COUNT(*), 2) 'cancellation Rate' FROM Trips WHERE (Request_at BETWEEN '2013-10-01' AND "2013-10-03") AND Client_Id IN (SELECT Users_Id FROM users WHERE Banned = 'No') GROUP BY Request_at ASC;

FBI Warning

這道題的描述是有問題的,leetcode上的題目也像是被更改過. “Write a SQL query to find the cancellation rate of requests made by unbanned users

”, user 應該包含partner, driver,client. 但是好像如果只處理"unbanned client" 也能通過.(提交記錄裡多數都是處理unbanned users)

註解

enum

類似C的列舉, 但是很多人認為mysql 中最好不要使用enum. 具體原因可baidu 之.

between

expr BETWEEN min AND max

[min,max], 兩邊都是閉區間

count

count(column) ---- 不統計null;
count(*) -------------- 統計null
count(distinct column) — 返回指定列的不同值的記錄數,會忽略列值為NULL的記錄(不包括空字串和0),即列值為NULL的記錄不統計在內。
e.g.:
統計sub_type='REFUND_FEE’ 的記錄數:

方法一.select count(sub_type) from t where t.sub_type='REFUND_FEE’;
方法二.select sum(if( B.sub_type='REFUND_FEE’ ,1,0)) from t;
方法三.select count(B.sub_type=‘REFUND_FEE’ or null) from t;

if

IF(expr1,expr2,expr3)
如果 expr1 是TRUE, IF()的返回值為expr2; 否則返回值則為 expr3。

IF() 的返回值為數字值或字串值,具體情況視其所在語境而定。

round || truncate

在mysql中,round函式用於資料的四捨五入,它有兩種形式:

  • round(x,d) ,x指要處理的數,d是指保留幾位小數
    TRUNCATE(x,y)函式返回被捨去至小數點後y位的數字x。若y的值為0,則結果不帶有小數點或不帶有小數部分。若y設為負數,則截去(歸零)x小數點左起第y位開始後面所有低位的值。
  • round(x) ,其實就是round(x,0),也就是預設d為0;

ROUND(x,y)函式在擷取值的時候會四捨五入,而TRUNCATE(x,y)函式直接擷取值,並不進行四捨五入。

in

列表項選擇. where column [NOT] in (…)

更多情況下,IN 列表項的值是不明確的,而可能是通過一個子查詢得到的:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=0)

關於引號

  1. mysql的欄位名、表名通常不需要加任何引號,如果非要加上引號,必須加反引號``(避免與系統關鍵字衝突);
  2. mysql的別名可以不加引號,如果加引號,單引號和雙引號以及反引號都可以;
  3. 單引號和雙引號都可以表示字串;

大小寫

linux下mysql安裝完後是預設:區分表名的大小寫,不區分列名的大小寫;
如果有更多的需求, 也可以自己設定是否大小寫敏感.