2012-11-04 40 views
3

我有一個包含以下列的表: id | fk_id | rcv_date按列分組的查詢結果的行號

可能有多個記錄具有常見的fk_id,它表示相關表中的外鍵標識。

我需要創建一個查詢,它將爲每條記錄分配一個行號,按fk_id分組,按rcv_date排序。

我最初開始用下面的查詢,這工作得很好進行排序和分配行號:

SELECT @row:[email protected] +1 AS ordinality, c.fk_id, rcv_date 
FROM (SELECT @row:=0) r, mytable c 
ORDER BY rcv_date 

但是 - 行計數和排序是整個數據集進行。我需要計數在一個普通的fk_id內。例如,以下示例數據將返回(第一列表示行數/標準):

1 | 5 | 2011-10-01 
2 | 5 | 2011-10-14 
3 | 5 | 2011-11-02 
4 | 5 | 2011-12-17 
1 | 8 | 2011-09-03 
2 | 8 | 2011-11-12 
1 | 9 | 2011-10-08 
2 | 9 | 2011-10-10 
3 | 9 | 2011-11-19 

中間一列代表fk_id。如您所見,排序和行計數在fk_id「分組」中。

UPDATE 我有一個似乎是工作的查詢,但想一些輸入它是否能加以改進:

SELECT IF(@last = c.fk_id, @row:[email protected] +1, @row:=1) AS ordinality, @last:=c.fk_id, c.fk_id, rcv_date 
FROM (SELECT @row:=0) r, (SELECT @last:=0) l, mytable c 
ORDER BY c.fk_id, rcv_date 

那麼,這樣做是爲了通過fk_id然後rcv_date - - 基本上處理我的分組。然後我使用第二個變量來比較前一個記錄中的fk_id與當前記錄:如果相同,我們增加行;如果不同,我們重置爲1.

我對真實數據的測試似乎正在工作。我懷疑這是一個非常低效的查詢,所以如果任何人有改進它的想法,或者看到可能的缺陷,我很樂意聽到。

+0

@Icdservices你不應該在同一個查詢中進行排序。它會破壞你辛苦賺來的金錢。首先在內部查詢中排序,然後按照我的解決方案進行排序 – nawfal

回答

3

這應該是非常簡單的。

SELECT (CASE WHEN @fk <> fk_id THEN @row:=1 ELSE @row:[email protected] + 1 END) AS ordinality, 
     @fk:=fk_id, rcv_date 
FROM (SELECT @row:=0) AS r, 
     (SELECT @fk:=0) AS f, 
     (SELECT fk_id, rcv_date FROM files ORDER BY fk_id, rcv_date) AS t 

我下令fk_id首先要保證你的所有外鍵走到一起(如果他們是不是真的在表中?),然後我做您的首選排序,由rcv_date IE瀏覽器。查詢檢查fk_id中的更改,如果有,則將行號變量設置爲1,否則變量將遞增。它在案件陳述中處理。請注意,@fk:=fk_id在大小寫檢查後完成,否則會影響行號。

編輯:只是注意到你自己的解決方案碰巧和我結束了。獎勵! :)