作者gpmm (银色)
看板Database
标题[SQL ] 使用 @ 做行数/排序心得
时间Fri Jul 27 16:22:59 2007
※题目:取得不同分类月份下的名次排序(一个月份可能有多个分类)
※环境: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)