※題目:取得不同分類月份下的名次排序(一個月份可能有多個分類)
※環境: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)