精華區beta Database 關於我們 聯絡資訊
※題目:取得不同分類月份下的名次排序(一個月份可能有多個分類) ※環境:mySql 5.0.27 ※準備:兩個 table - man、type 如下: man type man_id topic type_id number type_id type month (票數) (分類名) -------------------------------- --------------------- 0 A 0 99999 0 As 9 1 B 0 99998 1 Bs 10 2 C 1 1 2 Cs 9 3 D 1 3 4 E 1 5 5 F 2 7 ※SQL: SET @cnt := 0; SET @front := 0; SELECT @front AS _front, (IF ((@front = typeMonth), (@cnt := @cnt + 1), (@cnt := 0))), (@front := typeMonth), @front AS _after, @cnt AS rowNum, topic FROM ( SELECT tb1.*, tb2.month AS typeMonth FROM `man` AS tb1 LEFT JOIN `type` AS tb2 ON tb1.type_id = tb2.type_id ) AS tb3 ORDER BY typeMonth DESC, number DESC; ※輸出: _front _after rowNum topic -------------------------------- 0 9 0 A 9 9 1 B 9 9 2 F 9 10 0 E 10 10 1 D 10 10 2 C 最後想要取得的各月份下排名 ※其他: 之所以用 sub sql 作兩層是因為 @ 變數的記憶性, 會在如果對被 Join 者作排序時發生問題, 譬如在 SET @cnt 後,進行 SELECT (@cnt := @cnt + 1), @cnt AS rowNum FROM man LEFT JOIN type ON man.type_id=type.type_id ORDER BY type.month 會得出 rowNum 都為 0 的狀況(但實際上取回來的資訊裡,(@cnt := @cnt + 1) 還是有所累加的) 小弟猜想應該是如果從被 join 者回來排序時,db 要先預存一份已經 join 好的 暫時 table ,再對此 table 排序,所以才導致變數的無法使用?(亂猜的 XD) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.57.130.248 ※ 編輯: gpmm 來自: 61.57.130.248 (07/27 16:27)