Database 板


LINE

資料庫版本 MySQL 5.1 說明:假設賽車遊戲中各個賽道的基本資訊存在「任務」表格 ,而每次跑某一個賽道的記錄存在「記錄」表格,如下表所示: mission(任務) record(記錄) -------------------------------- ---------------------------------------- ai id(PK) name length level ai id(PK) m_id(FK) result spend_time 賽道名 距離 難度 結果名次 花費時間 -------------------------------- ---------------------------------------- 其中ai是AUTO_INCREMENT欄位、id是UUID()產生的主鍵欄位 record.m_id是參照到mission.id的外來鍵 result是INT型態,表示第幾名 每筆記錄只會對應到一個任務,而一個任務會有多個跑的記錄,也可能沒有(還沒跑) 測試資料如下:(id部份有簡化) mission(任務) -------------------------------- ai id(PK) name length level 1 d482 鈴鹿賽道 28 2 2 d6b0 筑波賽道 36 4 3 d7a1 茂木賽道 20 1 -------------------------------- record(記錄) ---------------------------------------- ai id(PK) m_id(FK) result spend_time 1 7d24 d482 1 00:04:57 (對應到鈴鹿賽道) 2 7dfa d7a1 8 00:10:23 (對應到茂木賽道) 3 51d8 d482 12 00:12:28 (對應到鈴鹿賽道) 4 17d3 d7a1 1 00:06:11 (對應到茂木賽道) 5 5755 d7a1 1 00:05:59 (對應到茂木賽道) ---------------------------------------- UI(使用者介面)想要呈現,各個賽道的基本資訊,以及各賽道最後一次跑的資訊 UI想要顯示的欄位與資料: 賽道名稱 距離 難度 最後一次名次 最後一次花費時間 ==================================================== 茂木賽道 20 1 1 00:05:39 筑波賽道 36 4 鈴鹿賽道 28 2 12 00:12:28 目前使用的SQL如下: (一)先列出賽道基本資訊(後建立的排在前面) SELECT id, name, length, level FROM mission ORDER BY ai DESC; (二)再由任務主鍵找出最新一筆跑的記錄 SELECT result, spend_time FROM record WHERE m_id = @id -- 由(一)取得的mission.id ORDER BY ai DESC LIMIT 1; 實作上,我們是DB與UI分工,我是將(一)(二)寫成兩個stored procedure 讓負責UI的同學來呼叫,就是將(一)取得的mission.id存入陣列,再呼叫(二) 現在問題來了,如果UI想要各進階一點,將結果名次納入查詢條件中, 例如名次是第一名的賽道資料才列出,由於我這邊SQL不知道怎麼下, 只好請UI的同學還是用(一)(二)撈出所有資料,再過濾出 result = 1 的資料 UI預計得到結果 賽道名稱 距離 難度 最後一次名次 最後一次花費時間 ==================================================== 茂木賽道 20 1 1 00:05:39 想請問一下,如果我還是想讓資料過濾的部份讓資料庫來作的話, (1)需要怎麼下SQL (2)或是目前設計的資料表需要增加或是修改嗎 我有試過子查詢: SELECT m.name, m.length, m.level, ( SELECT r.result FROM record r WHERE r.m_id = m.id ORDER BY ai DESC LIMIT 1 ) AS result, ( SELECT r.spend_time FROM record r WHERE r.m_id = m.id ORDER BY ai DESC LIMIT 1 ) AS spend_time FROM mission m ORDER BY ai DESC; 取得結果如下: name length level result spend_time 茂木賽道 20 1 1 00:05:59 筑波賽道 36 4 \N \N 鈴鹿賽道 28 2 12 00:12:28 可以將(一)(二)整合在一起,但是不知道要下WHERE條件撈出result = 1的資料 (可以的話希望盡量不用子查詢) 另外也試了左結合(沒有跑的記錄的賽道也列出,再篩選) SELECT m.name, m.length, m.level, r.result, r.spend_time FROM mission m LEFT JOIN record r ON m.id = r.m_id WHERE r.result = 1 ORDER BY m.ai DESC; 取得結果如下: name length level result spend_time 茂木賽道 20 1 1 00:06:11 茂木賽道 20 1 1 00:05:59 鈴鹿賽道 28 2 1 00:04:57 但是這樣會撈出各賽道的所有記錄(例如茂木賽道就撈出兩筆) 只撈各賽道的最後一筆記錄的條件,就不知道怎麼下SQL了 想請大家指點迷津。感謝。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.75.30.164 ※ 編輯: jiyon 來自: 211.75.30.164 (02/26 14:37) ※ 編輯: jiyon 來自: 211.75.30.164 (02/26 15:23) ※ 編輯: jiyon 來自: 211.75.30.164 (02/26 15:26)







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP