2012-09-06 28 views
0

我有數據列:如何使用迭代對(非標準)mysql數據進行排序?

id name type number 
1 n1 t1 num1 
2 n2 t1 num2 
3 n3 t1 num3 
4 n10 t1 num10 

5 n4 t2 num4 
6 n5 t2 num5 
7 n6 t2 num6 

8 n7 t3 num7 
9 n8 t3 num8 
10 n9 t3 num9 

它可以選擇我shuld運行得到這樣的結果?

id name type number 
1 n1 t1 num1 
5 n4 t2 num4 
8 n7 t3 num7 

2 n2 t1 num2 
6 n5 t2 num5 
9 n8 t3 num8 

3 n3 t1 num3 
7 n6 t2 num6 
10 n9 t3 num9 

4 n10 t1 num10 

我想這可能是正確的方式來使用過程,但它可以在簡單的查詢中排序嗎?

更新1: 名稱,類型和編號列是獨立的。我需要按照您在結果示例中看到的類型進行排序。

+0

這些表如何鏈接?沒有鑰匙? – Cosmin

+0

我選擇了所有記錄並將其導出到php數組,然後完成了組。這是不正確的方式。 – Anthony

+0

@Cosmin,肯定它有更新後瞭解它 – Anthony

回答

4
SELECT x.id,x.name,x.type,x.number 
    FROM (SELECT t.id, 
       t.name,t.type,t.number, 
       CASE 
       WHEN @type != t.type THEN @rownum := 0 
       WHEN @type = t.type THEN @rownum := @rownum + 1 
       ELSE @rownum 
       END AS rank, 
       @type := t.type 
      FROM scores t, 
       (SELECT @rownum := 0, @type)var 
     ORDER BY t.type) x 
ORDER BY x.rank, x.type 

SQL FIDDLE HERE

+0

哎呀!這正是我需要的!謝啦! 你能描述一下這個字符串是什麼意思:(SELECT @rownum:= 0,@type)var? – Anthony

+0

即聲明變量。你可以在這裏閱讀更多。 http://dev.mysql.com/doc/refman/5.6/en/user-variables.html – sel

+0

@sel你能澄清一下,'(SELECT @rownum:= 0,@type)var'在做什麼?我試圖弄清楚,但更改SQL到'(SELECT 0)var'產生相同的結果 - [Fiddle](http://sqlfiddle.com/#!2/2417a/11) – mrmryb

1
select name, type, number 
from (
    select t1.name, t1.type, t1.number, count(*) as typeSubIndex 
    from mytable t1 
    join mytable t2 on t1.type = t2.type 
    where t1.id >= t2.id 
    group by t1.name, t1.type, t1.number 
) order by typeSubIndex, type 

說明: - 加入你的表本身上同一類型的列,用一個額外的列名爲typeSubIndex那是它自己組內的每個類型的順序:

name type number typeSubIndex 
n1 t1 num1 1 
n2 t1 num2 2 
n3 t1 num3 3 
n10 t1 num10 4 
n4 t2 num4 1 
n5 t2 num5 2 
n6 t2 num6 3 
n7 t3 num7 1 
n8 t3 num8 2 
n9 t3 num9 3 

然後,它只是首先通過typeSubIndex,然後按類型排序這個結果。

+0

如果您的記錄太多,則此腳本需要很長時間才能獲得結果 – Anthony