2013-01-04 99 views
0

這裏還是提出問題的新手,所以這是我第二次嘗試解決我面臨的問題。對SQL命令的限制

我有一張已經按Score排序的表。每個記錄可以是3種類型之一。我想按照Score對錶格重新排序,但對每10個記錄中的組合施加一個額外的限制。特別是,有三種類型的特定混合物。

在下面的例子中,我希望有類型C中的至少2和A型

我有什麼的至多2

------------------------------------------ 
ID  Score  Type 
------------------------------------------ 
1  100   A 
2  99   B 
3  97   B 
4  92   A 
5  91   C 
6  85   A 
7  83   B 
8  81   B 
9  75   B 
10  70   B 
11  65   A 
12  61   C 
13  59   B 

我想什麼

------------------------------------------ 
ID  Score  Type 
----------------------------------------- 
1  100   A 
2  99   B 
3  97   B 
4  92   A 
5  91   C 
7  83   B 
8  81   B 
9  75   B 
10  70   B 
12  61   C 

我不認爲這可以通過Group By或usort以有效的方式解決。我最初的解決方案是導出到PHP並在那裏重新排序。

+2

(1)表是不排序。 (2)您使用的是什麼RDBMS? –

+0

我正在使用mysql – rami

+0

如果您使用SQL Server> 2005,我認爲您可以使用RANK來獲得您想要的內容。有關更多詳細信息,請參閱http://msdn.microsoft.com/en-us/library/ms176102.aspx。 – cciotti

回答

0

我假設你想要返回TYPE = C的所有行,並返回所有具有TYPE = B的行,但返回的類型最多隻有2行。

這將在ORACLE中工作--ROWNUM可以在子查詢中用來限制行數。

(在另一個數據庫ROWNUM甚至可能不會實現)

SELECT 
T.* 
FROM 
(
    select * 
    from 
    (
      select T.ID, T.SCORE, T.TYPE 
      from YourTable T 
      WHERE TYPE='A' 
      ORDER BY T.SCORE DESC 

    ) 
    WHERE ROWNUM <=2 
    UNION 
    select * 
    from 
    (
      select T.ID, T.SCORE, T.TYPE 
      from YourTable T 
      WHERE TYPE='B' 
      ORDER BY T.SCORE DESC 

    ) 

    UNION 
    select * 
    from 
    (
      select T.ID, T.SCORE, T.TYPE 
      from YourTable T 
      WHERE TYPE='C' 
      ORDER BY T.SCORE DESC 

    ) 


) T 
ORDER BY T.SCORE DESC; 
+0

不完全。我希望這種排序每10行發生一次。而且我還希望每10行至少有2個類型C. – rami

+0

您能否通過在「每10行內」訂購來解釋您的意思? –

+0

這意味着前10條記錄至少有2個typeC,後10條記錄至少有2個typeC,依此類推。 – rami

0

試試這個:

SELECT id, score, a.type 
FROM (SELECT id, score, a.type, IF(@lasttype = (@lasttype:=a.type), @index:[email protected]+1, @index:=0) indx 
     FROM tablename t, (SELECT @lasttype:='', @index:=0) AS a 
     ORDER BY TYPE, score DESC) AS a 
WHERE (a.type NOT IN ('A', 'C') OR (a.type IN ('A', 'C') AND indx <= 2)) 
ORDER BY score DESC;