2015-10-02 35 views
1

如何在結果在這個SQL使用@row_number狀的位置排:在結果中獲取行位置?

SELECT s.*, 
s2.priority AS `priority`, 
@row_number := @row_number := @row_number + 1 AS `top` 

FROM (SELECT @row_number := 0) init, `server` s 
     LEFT JOIN servers_services ss ON (s.id = ss.server_id) 
     LEFT JOIN service s2 ON (s2.id = ss.service_id) 
WHERE s.is_banned = 0 

ORDER BY ss.service_id IS NULL, priority DESC 

@row_number取值爲{1,12,89 ...}爲什麼呢?

+0

'@row_number:= @row_number:= @row_number + 1'>'@row_number := @row_number + 1' – RubahMalam

+0

@RubahMalam,你的例子打印「0」作爲頂部 –

+0

實際上,你的查詢應該有效,除非你有另一個更長的查詢比這個。 – RubahMalam

回答

0

我沒有變量在MySQL中的經驗,所以我的激怒可能是錯誤的。

我的猜測是:你交叉連接你的表的行號。然後在WHERE子句中關閉記錄,因此只留下一些原始行號。

至於如何解決這個問題,我想不加入擺在首位不需要的記錄應該有所幫助:

FROM (SELECT @row_number := 0) init 
JOIN server s ON s.is_banned = 0 
LEFT JOIN servers_services ss ON (s.id = ss.server_id) 
LEFT JOIN service s2 ON (s2.id = ss.service_id)